http://www.roading.org/develop/cpp/vc%E5%86%85%E5%AD%98%E5%AF%B9%E9%BD%90%E5%87%86%E5%88%99%EF%BC%88memory-alignment%EF%BC%89.html
变量存放的起始位置2应为变量的大小与规定对齐量1中较小者的倍数。例如,假 设规定对齐量为4,那么char(1byte)变量应该存储在偏移量为1的倍数的地方,而整形变 量(4byte)则是从偏移量为4的倍数的地方,而double(8 byte)也同样应存储在偏移量为 4的倍数的地方,为什么不是8?因为规定对齐量默认值为4,而4 < 8。vc,g++默认对齐量为8。
- 结构体整体的大小也应该对齐,对齐依照规定对齐量与最大数据成员两者中较小的进行。
#include<iostream> using namespace std; class A { char a; double b; int c; }; int main() { cout<<sizeof(A)<<endl; }
输出 24
默认规定对齐量为8。
sizeof(char)=1<8,变量a存储在偏移量为1倍的地方。
sizeof(double)=8==8,变量存储在偏移量为8倍的地方。
sizeof(int)=4<8,变量存储在偏移量为4倍的地方。
整体的大小也应对齐,最大数据成员double,sizeof(double)==8,所以sizeof(A)应为double的倍数。所以为24。
#include<iostream> #pragma pack(4) using namespace std; class A { char a; double b; int c; }; int main() { cout<<sizeof(A)<<endl; }
sizeof(char)=1<4,变量a存储在偏移量为1倍的地方。
sizeof(double)=8==4,变量存储在偏移量为4倍的地方。
sizeof(int)=4==4,变量存储在偏移量为4倍的地方。
整体的大小也应对齐,最大数据成员double,sizeof(double)==4,所以sizeof(A)应为double的倍数。所以为16。
class 对象对齐
最新推荐文章于 2023-05-28 16:28:27 发布