C结构体对齐
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C结构体对齐相关的知识,希望对你有一定的参考价值。
函数模板针对仅参数类型不同的函数?
http://blog.csdn.net/renrenhappy/article/details/5931457
计算结构体的大小就要考虑数据对齐问题. 为了使CPU的存取速度最快, 在处理数据的时候把结构变量中的成员大小按照4或8的倍数计算, 这是因为数据总线的宽度一般为4字节或者8字节.
可加上#pragma pack(n)的设定.
缺省情况下, 编译器为结构体的每个成员按其自然对界条件分配空间(即按照结构体成员之中最大的成员对齐).
默认的字节对齐准则如下:
1. 结构体变量的首地址能够被其最大的成员大小整除.
2. 结果体每个成员相对于结构体首地址的Offset是成员大小的整数倍, 这也是为什么一个char 后边接一个int, 那个char要被填充3个字节的原因, 如果是3个char一个int, 则填充一个字节. 在本题之中, int64_t c的偏移要是8的整数倍.
3. 结构体的总大小为结构体最大基本类型成员大小和编译器缺省对界条件大小中比较小的那个值的整数倍, 如果有需要, 会在最后一个成员之后加上填充字节.
4.结构体作为成员时, 则结构体成员要从其内部最大元素大小的整数倍地址开始存储.
在本题中, char a; 4, int b; 4, int64_t c; 8, chard; 8. 结构体总共24个字节, 24x15 + 8 == 368.
以上是关于C结构体对齐的主要内容,如果未能解决你的问题,请参考以下文章