首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

腾讯的一路关于sizeof的面试题

2013-10-31 
腾讯的一道关于sizeof的面试题。本帖最后由 uv760 于 2013-10-31 08:58:54 编辑去腾讯面试,遇到这样一道题:

腾讯的一道关于sizeof的面试题。
本帖最后由 uv760 于 2013-10-31 08:58:54 编辑 去腾讯面试,遇到这样一道题:
有一个类
class A
{
int a;
static int b;
char c;
virtual int funcA();
int funcB();
};
求sizeof(A)为多少?
我的理解是:首先static不需要计算在内,一个4个字节的虚函数表+一个4个字节的int型a变量+一个1个字节的char型的c变量(由于char型的c与4个字节的头对齐,所以后面不用再对齐字节)=9
但是我在VS2010上运行出来的结果却是12,求解释。
[解决办法]
普通程序员心目中的内存印象,由一个个的字节组成,而CPU并不是这么看待的。CPU把内存当成是一块一块的,块的大小可以是2,4,8,16字节大小,因此CPU在读取内存时是一块一块进行读取的。块大小成为memory access granularity(粒度) 本人把它翻译为“内存读取粒度” 。默认的读取粒度是4字节大小。 
这个粒度可以通过#pragma pack()来调整
那么编译器是按照什么样的原则进行对齐的?
1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。
 
2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)
 
3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.

热点排行