目录
先看两个问题
struct s1
{
char a = 1;
int b = 2;
char c = 3;
};
int main() {
cout << sizeof(s1) << endl;
}
struct s2 {
char a = 1;
char c = 3;
int b = 2;
};
int main() {
cout << sizeof(s2) << endl;
}
朋友们会对其的结果的想法是什么呢?答案一样吗,还是说不一样,不一样的话会是什么呢?
答案肯定是不一样的
两种相同的代码,只不过是顺序不同,为什么结构体的大小就不同了呢?
接下来就是要解释这个原因,关于结构体对齐规则:
结构体对齐规则
- 第一个成员在与结构体变量偏移量为0的地址处。(它到0开始处,中间隔了多少,偏移量就是多少)
- 其它成员要对齐到某个数(对齐数)的整数倍地址处。
- 结构体的总大小为最大对齐数的整数倍。
- 如果嵌套类其它结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处。结构体的整体大小就是所有的最大对齐数的整数倍
对齐数的计算方法:编译器默认的一个对齐数 与该成员大小的较小值,VS的对齐数是8
我们运用一下这些规则
struct s2 {
char a = 1;
char c = 3;
int b = 2;
};
其他编译器好像没有默认对齐数,所以一般采用成员的自身对齐
结构题对齐原因
这里只给出一种参考,如果采用未对齐的内存,处理器访问内存需要做两次处理
举个例子,我们在使用32位处理器的时候(一次可以处理32位比特位)
修改默认对齐数
#pragma (n) n为默认对齐数
#pragma() 恢复编译器默认对齐数
以上就是对结构体的对齐规则的介绍,还请大佬们阅览,请帮我指出问题所在,谢谢