1 首先引用网友redleaves的话:
"结构体的字段取自身对齐参数(字段类型的大小)和指定对齐参数(pack给出的参数)的小者对齐; 结构体的大小必须是所有对齐参数的整数倍,不足则补空位; 结构体变量的对齐参数取所有对齐参数中最大的"。
这里的对齐是指该字段的起始位置(必须是对齐参数的整数倍)。
所有int型的地址都是sizeof(int)的整数倍。直观上看,内存结构是很规整的。
2 关于自然对齐
没有绝对的自然对齐,只有编译器默认的对齐方式。
3 关于编译器和平台
在不同的平台下,不同的编译器下虽然遵循的规则是一样的, 但编译器和平台却有很大差异。
3.1 关于编译器(指定对齐参数的问题)
编译器一般会有一个默认的对齐参数, 这个参数越大,那么对齐方式就越自然(因为对齐参数取的是编译器给出的对齐参数和字段大小中的小者)
Debian Linux, G++ 默认对齐参数为4,最大也为4
Win XP, VC 默认对齐参数为16, 最大也为16
3.2 关于64位的平台(自身对齐参数的问题)
64位平台的问题主要是引起对int型,long型变量类型大小讨论。
这牵扯到了C语言标准,和行业标准.
我认为错误的观点:
“因为在C89,90,99,C++98的标准中,int的长度是会随平台不同而变化的,long的长度却始终是固定的32位.”
“不过根据我查看标准文档,文档里说只有"plain int"即"int"类型是随平台变化的,其它的整数类型都是定长的."
“至于编译器为什么这么做,我就不得而知了.但如果64位台下long是64位,那C99中加入的long long类型可以说是多此一举了....”
"结构体的字段取自身对齐参数(字段类型的大小)和指定对齐参数(pack给出的参数)的小者对齐; 结构体的大小必须是所有对齐参数的整数倍,不足则补空位; 结构体变量的对齐参数取所有对齐参数中最大的"。
这里的对齐是指该字段的起始位置(必须是对齐参数的整数倍)。
所有int型的地址都是sizeof(int)的整数倍。直观上看,内存结构是很规整的。
2 关于自然对齐
没有绝对的自然对齐,只有编译器默认的对齐方式。
3 关于编译器和平台
在不同的平台下,不同的编译器下虽然遵循的规则是一样的, 但编译器和平台却有很大差异。
3.1 关于编译器(指定对齐参数的问题)
编译器一般会有一个默认的对齐参数, 这个参数越大,那么对齐方式就越自然(因为对齐参数取的是编译器给出的对齐参数和字段大小中的小者)
Debian Linux, G++ 默认对齐参数为4,最大也为4
Win XP, VC 默认对齐参数为16, 最大也为16
3.2 关于64位的平台(自身对齐参数的问题)
64位平台的问题主要是引起对int型,long型变量类型大小讨论。
这牵扯到了C语言标准,和行业标准.
我认为错误的观点:
“因为在C89,90,99,C++98的标准中,int的长度是会随平台不同而变化的,long的长度却始终是固定的32位.”
“不过根据我查看标准文档,文档里说只有"plain int"即"int"类型是随平台变化的,其它的整数类型都是定长的."
“至于编译器为什么这么做,我就不得而知了.但如果64位台下long是64位,那C99中加入的long long类型可以说是多此一举了....”
我认为正确的观点
“我在ia64,ibm,hp的64位平台都作过测试。一般64位平台遵守 LP64模型,即long和pointer类型是64位的,其他类型长度一般与原来的32位平台相同”
(LP64模型 Long Pointer)