程序员面试题精选(41):编译器对内存填充长度之误解

来源:互联网 发布:淘宝李宁官方折扣店 编辑:程序博客网 时间:2024/05/22 03:15
看了《C++ 对像模型》的人,往往会误以为编译器填充是按照计算机字长填充的,如下:

class A
{
   double a;
   char b;
};

sizeof(A) == ?

    不了解填充的人会以为是9,看了c++对象模型的(像我)往往会以为是12,昨晚看《程序员面试宝典》一道类似题,开始以为答案给错了。。今天一试才知道,原来我错了。。上题答案(在编译器默认情况下)是 16,VC6.0、MinGW、VS.net均如此。。

    《程序员面试宝典》上如是说:CPU的优化原则大致是这样的:对于n字节的元素(n=2、4、8……)它的首地址能被n整除,才能获得最好的性能。设计编译器的时候可以遵循这个原则。也就是说,默认情况下,编译器往往以最大的变量的长度为填充长度,而不是按字节长度。当然也可以通过 #pragma pack(n) 指定编译器的填充长度。这时候应该不是cpu的效率最高的情况了。

    另外有个网友讨论说道如果一个类中含有另一个类对象,是否按照包含类的长度填充呢?试验了一下,不是这样,而是按照语言中的基本类型的最大长度填充。没想到,面试题中也会考到这么bt的题目,长见识了。