c++类不含有数据成员(静态除外),则不会为该类实例分配存储空间,该类实例只占用一个字节空间

c++类不含有数据成员(静态除外),则不会为该类实例分配存储空间,该类实例只占用一个字节空间

见如下分析过程

1、类Counter 除了一个静态数据成员外,没有其它任何非静态数据成员了

2、sizeof该类,其结果为1

3、引用该类实例时,基址寄存器加上偏移,如实例Counter o1;(lea    rax,[rbp-0x11])

4、只有一个字节存储类实例相关信息,那么具体存了哪些信息呢?这个现还清楚的,通过dump该实例内容,其结果都是0

class Counter 
{
public:
static int count;
Counter() 

count++; 
}


~Counter() 

count--; 
}
};


void f();


int main(void)
{
Counter o1;
cout << "Objects in existence: ";
cout << Counter::count << "\n";


Counter o2;
cout << "Objects in existence: ";
cout << Counter::count << "\n";
f();
cout << "Objects in existence: ";
cout << Counter::count << "\n";
return 0;
}


(gdb) p sizeof(Counter)
$1 = 1



Dump of assembler code for function main():
23 {
   0x00000000004008e0 <+0>: push   rbp
   0x00000000004008e1 <+1>: mov    rbp,rsp
   0x00000000004008e4 <+4>: push   rbx
   0x00000000004008e5 <+5>: sub    rsp,0x18


24 Counter o1;
   0x00000000004008e9 <+9>: lea    rax,[rbp-0x11]
   0x00000000004008ed <+13>: mov    rdi,rax
   0x00000000004008f0 <+16>: call   0x400aa8 <Counter::Counter()>

... ....

28 Counter o2;
   0x0000000000400923 <+67>: lea    rax,[rbp-0x12]
   0x0000000000400927 <+71>: mov    rdi,rax
   0x000000000040092a <+74>: call   0x400aa8 <Counter::Counter()>



(gdb) x /2bx $rbp - 0x12
0x7fffffffe4ce:0x000x00


猜你喜欢

转载自blog.csdn.net/skillfulit/article/details/52879405