【2017-07-01】Linux应用开发工程师面试问题记录之二:关于结构体的大小及内存对齐问题
Tencent后台服务器开发有一道题是计算一个结构体的sizeof的大小:
struct strData
{
int m_Int;
char m_Char;
short m_Short;
char m_Flag;
}
系统为32位的Unix机器,请问sizeof(strData)的值是多少?
在32位系统中,int类型为4个字节,char类型为1个字节,short为2个字节,所以理论上上述结构体占用的空间总共为8个字节;
但是,内存存放数据时如果各种类型合理对齐时,cpu访问数据的效率就比较高;比如某些平台上每次读取数据都是从偶地址开始,如果数据字节对齐的话,可能只需要一个cpu周期就可以取得数据。
因此,假设存储地址从0x0000开始,则上述结构体中,m_Int是0-3,m_Char是4,m_short是6-7,m_Flag是8,共9个字节,鉴于4字节对齐,所以还需要额外的3字节,因此sizeof此结构体的大小为12个字节。
如果改成
struct strData
{
short m_Short;
char m_Char;
char m_Flag;
int m_Int;
}
这样的话就是8个字节了。
注意一定是偶数地址对齐,而且整个结构体的大小也必须是结构体最大对齐值的整数倍。
当然了,如果是单字节对齐就是理想的内存占用。
这也算是最基本的问题了,如果这也答错了,那被鄙视也是应该的了。
希望能知耻而后勇。
参考链接:
为什么需要字节对齐?
http://blog.csdn.net/zkf11387/article/details/7662450
详解结构体、类等内存字节对齐
http://zhangyu.blog.51cto.com/197148/673792/
http://blog.csdn.net/sky_qing/article/details/11650497/