Welcome

首页 / 软件开发 / VC.NET / vs2008下C++对象内存布局(1)

vs2008下C++对象内存布局(1)2009-11-07 csdn博客 快乐虾本文适用于

Xp sp3

Vs2008

近日,因为调试cygwin.dll出了点状况,与C++对象的内存布局有关,故此决定先看看vs2008对C++对象内存的管理。

1.1 最简单的类

写一小段简单代码:

class CTest
{
public:
int var_a;
int var_b;
int var_c;

public:
void fun1()
{
var_a = 10;
}
void fun2()
{
var_b = 20;
}
};

CTest a, *p;

int _tmain(int argc, _TCHAR* argv[])
{
a.var_a = 1;
a.var_b = 2;
a.var_c = 3;

p = &a;
p->fun1();
p->fun2();
return 0;
}

为了更直观地观察编译器的行为,把a和p做为全局变量。

1.1.1 赋值语句的行为

先观察赋值语句的行为:

a.var_a = 1;
004113CE C7 05 C0 74 41 00 01 00 00 00 mov dword ptr [a (4174C0h)],1
a.var_b = 2;
004113D8 C7 05 C4 74 41 00 02 00 00 00 mov dword ptr [a+4 (4174C4h)],2
a.var_c = 3;
004113E2 C7 05 C8 74 41 00 03 00 00 00 mov dword ptr [a+8 (4174C8h)],3

再观察赋值结束后p指向的内存区域:

0x004174C0 01 00 00 00 02 00 00 00 03 00 00 00 00 00 00 ...............

显然,这个时候p指向CTest::var_a,也就是说vs2008并没有在类中插入多余的内容。CTest的大小为var_a, var_b, var_c的大小之和,即12个字节。

1.1.2 函数调用的行为

再观察一下函数调用的行为:

p->fun1();
004113F6 8B 0D BC 74 41 00 mov ecx,dword ptr [p (4174BCh)]
004113FC E8 53 FD FF FF call CTest::fun1 (411154h)
这段代码可以说明CTest::fun1的调用和其它的C代码并没有什么不同,一个函数而已。看看call把我们带到哪里:
00411118 E9 83 03 00 00 jmp CTest::fun2 (4114A0h)
0041111D E9 6E 15 00 00 jmp __CxxUnhandledExceptionFilter (412690h)
00411122 E9 E9 15 00 00 jmp __CxxSetUnhandledExceptionFilter (412710h)
00411127 E9 64 24 00 00 jmp QueryPerformanceCounter (413590h)
0041112C E9 9F 16 00 00 jmp _wsetargv (4127D0h)
00411131 E9 0A 17 00 00 jmp __p__commode (412840h)
00411136 E9 89 22 00 00 jmp _unlock (4133C4h)
0041113B E9 62 24 00 00 jmp GetCurrentProcessId (4135A2h)
00411140 E9 9B 04 00 00 jmp _RTC_CheckStackVars2 (4115E0h)
00411145 E9 80 18 00 00 jmp __set_app_type (4129CAh)
0041114A E9 A1 03 00 00 jmp _RTC_CheckEsp (4114F0h)
0041114F E9 8C 16 00 00 jmp _RTC_Initialize (4127E0h)
00411154 E9 07 03 00 00 jmp CTest::fun1 (411460h)