常有这样的面试题,给出如下struct,并问test占多少字节
这是一种比较常见的面试题,今天看了不少资料,结合前任的分析,做一个小笔记。
首先这篇文章中的一些概念介绍的比较清楚,
结构体的对齐包含以下两层含义:
1.结构体内各个数据成员内存对齐(data alignment)
2.结构体总长度填充(data structure padding)
数据成员内存对齐指的是在内存中存放数据时,要在以字长的整数倍为起始位置,因为这样有利于CPU高效的读写内存。
现代CPU在读写内存时都是以字为单位进行读写,32为机器上一次读写4个字节,现在假设要读取一个int数据x=1234(4字节),
假设x在内存存储如下:
即x是内存对齐的,那么CPU在读它的时候,直接读取一次,只读0–3这四个字节就可以了,但是如果x在内存中这样存储:
那么,同样是读取x,这一次CPU不得不读两次,第一次0–3这个字节,第二次4–7,时间上的开销无形之中多了一倍。
关于结构体总长度填充,这个问答上说的
可能比较靠谱,即是为了结构数组中的每一个都能在开始的时候内存对齐,否则不论你内部对齐的多么牛逼,万一开始就在一个不对齐的
地方,那么内部的对齐也就没有意义了。我感觉这里之所以不得不在末尾填充,就是因为数组在内存中连续存储的。
介绍完概念,就该介绍方法了。这篇博客在对齐的方法上给了我不少启发,
当然,想要获得结构体的总长度,首先需要知道各个基本类型的长度,下面的程序在我本机(64位windows)上调通并且执行结果在注释中:
接着就是下面的不同的结构体的计算了,在下面的程序中,用-表示用无用字符填充,即占位,| 则表示是当前类型占用,是实际使用的字节
blog comments powered by