今天面试遇到了一个颇有意思的问题,即空结构体在C++中所占的内存大小是多少?参见以下代码:ios
#include <iostream> struct S0 { }; int main() { std::cout << sizeof S0 << std::endl; return 0; }
面试官当场提醒了我一下,说若是S0对象所占用的内存大小为0,那么将能够申请无限多个此类型的对象数组,而且大小永远为0。我当时以为有点道理,不过转念一想,仍是有点疑惑。面试
回来研究了一下,原来在C++语言中的确规定了空结构体和空类所占内存大小为1,而C语言中空类和空结构体占用的大小是0(在gcc中测试为0,其余编译器不必定)。由此又产生了一个新的疑问:为何C++会有这样的规定呢?数组
原来,C++语言标准中规定了这样一个原则:“no object shall have the same address in memory as any other variable”,即任何不一样的对象不能拥有相同的内存地址。若是空类对象大小为0,那么此类数组中的各个对象的地址将会一致,明显违反了此原则。测试
进一步地,C++作出这样规定的缘由究竟有什么道理呢?请看下面这个计算元素个数的例子:spa
T array[5]; int count = &array[4] - &array[0];
这种指针相减的运算在编译器中会等价于以下步骤:指针
count = ((char *)&array[4] - (char *)&array[0]) / sizeof T;
若是容许C++对象大小为0,那么这里的运算将产生两个问题:(1)不能经过指针区分不一样的数组对象;(2)sizeof T为0致使非法的除0操做。这样一来,编译器还须要用一些复杂的代码来处理这些异常状况信息。code
为了知足C++标准规定的不一样对象不能有相同地址,C++编译器保证任何类型对象大小不能为0。C++编译器会在空类或空结构体中增长一个虚设的字节(有的编译器可能不止一个),以确保不一样的对象都具备不一样的地址。对象