程序员面试题精选(41):编译器对内存填充长度之误解
2007-11-14 21:54
525 查看
看了《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的题目,长见识了。
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的题目,长见识了。
相关文章推荐
- 程序员面试题精选100题(41)-把数组排成最小的数
- 程序员面试题精选100题(46)-对称子字符串的最大长度
- 程序员面试题精选100题(41)-把数组排成最小的数
- 程序员面试题精选100题(46)-对称子字符串的最大长度
- 程序员面试题精选100题(46)-对称子字符串的最大长度
- 程序员面试题精选100题(41)-把数组排成最小的数
- 程序员面试题精选100题(41)-把数组排成最小的数
- free如何知道释放内存长度:vs与glibc分配内存时编译器内部处理
- 程序员面试题精选100题(41)-把数组排成最小的数[算法]
- 区分全角和半角的字符串指定长度截取(或填充)
- str_pad() 将字符串填充成指定长度的字符串
- LCC编译器的源程序分析(41)赋值表达式的有向无环图
- 程序员面试题精选100题(12)-从上往下遍历二元树
- VC编译器限制字符串长度不能超过65535,NND
- 程序员面试题精选100题(57)-O(n)时间的排序
- 程序员面试题精选--栈的push、pop序列判定
- 程序员面试题精选-设计包含min函数的栈
- 微软指定编译器不做字节填充方法
- Keil MDK编译器内存分配
- 程序员面试题精选(2):设计包含min函数的栈