首页 > 代码库 > sizeof 运算结果与编译系统有关

sizeof 运算结果与编译系统有关

研究与实现相关的layout没多大意义

参考:有关c++中类的虚拟继承sizeof问题

class A{};
sizeof(A);
问sizeof结果?

对空类运用sizoef operator,表达式结果是多少?不是0,空类中没有信息,但实例仍需要在内存中有一些信息,这样才能使用,类的内存布局由编译器决定,vs中占用1字节。如果空类中含有虚函数,在类的实例中会添加指向虚函数的指针,指针在32位机器上占用4bytes,64(x64编译模式)位占用8字节。int在c++标准中没有规定具体大小,所以在不同平台上 sizeof(int) 也会不同。

情况2:sizeof(string)的大小?

这与实现有关。vs下string有短字符串优化,string含有一个缓冲区。sizeof作用于类类型结果未定义,implemtation defined,既由实现定义的。

情况3:sizeof(strcut)的大小?

 

1 struct s
2 {
3     int a;
4     char c;
5     double d;
6 }

 

结果并不是int+char+double的大小和,因为memory alignment,按照struct alignment的对齐规则,实际需要的内存多。

情况4: malloc为类类型分配动态内存:

1 string *q = (string*)malloc(sizeof(string) * 5);
2 *q = "djd";

会发生运行错误。malloc只分配了内存,不会调用string的构造函数做初始化。语句2为什么不能完成初始化呢?推测原因是sizeof只求了vs下string类的内存布局大小,malloc没有为一个string分配属于它的内存空间——用于存字符串序列 。联想到allocator类分配的内存是未初始化的,如果不用construct()构造内存,无法使用。

1 allocator<string> alloc;
2 string *strp = alloc.allocate(10)
3 *strp = "djka";
4 alloc.construct(strp, ".jj");

语句3 error

 

sizeof 运算结果与编译系统有关