sizeof 运算结果与编译系统有关
Posted hchacha
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sizeof 运算结果与编译系统有关相关的知识,希望对你有一定的参考价值。
研究与实现相关的layout没多大意义
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 运算结果与编译系统有关的主要内容,如果未能解决你的问题,请参考以下文章