Linux gcc没有默认对齐数
在自己解决问题中遇到了内存对齐的问题。突然发现我的Linux默认对齐数好像不是4。可以参考这个OJ题来理解。有趣的内存对齐面试题CSDN上好像所有的博客都说是4。然后就记录一下怎么推断出自己系统的默认对齐数。
推断对齐数
首先,我们先写一个程序:
#include <iostream>
struct test
{
char a;
double b;
char c;
};
int main(void)
{
std::cout << sizeof(test) << std::endl;
return 0;
}
如果系统的默认对齐数是4 。那么这个结构体就是这样存的。
我们也很轻松的可以知道这样存这个结构体的大小就会是16 。那么我们来看看是不是16 。
居然是24 。那么它在系统中就是这样存的。
因为double的大小也是8 。所以我还不能确定对齐数是不是8。但是我可以确定对齐数不是4。
如果你还不死心,那我就手动把对齐数设置为4,看看结构体的大小是不是16。
#include <iostream>
#pragma pack(4)
struct test
{
char a;
double b;
char c;
};
int main(void)
{
std::cout << sizeof(test) << std::endl;
return 0;
}
#pragma pack()
进一步证明
由上面我们得出的结论,我们确定了对齐数不是4,我们推断对齐数是8。
怎么证明呢,很好办,我们只需要找一个比8个字节大的类型就行,比如long double
。
long double
在VS中是8个字节大小。在Linux中是16个字节大小。
#include <iostream>
//#pragma pack(8)
struct test_plus
{
char a;
long double b;
char c;
};
int main(void)
{
std::cout << sizeof(long double) << std::endl;
std::cout << sizeof(test_plus) << std::endl;
return 0;
}
//#pragma pack()
如果说默认对齐数是8,那么这个test_plus
结构体的大小应该是32吧,但是!!看结果。
那么,我们手动把Linux的默认对齐数设置为8看看结果。(就是把上面代码注释掉的部分解开)
所以!我的推断是:至少在我的Linux gcc 4.8.5版本是没有默认对齐数的,默认下一次对齐到每个类型的对齐数处。
然后我尝试去读一读gcc文档,发现第一次读文档从哪里看都不知道,而且全是英文,还好我发现了求助邮箱,我就给gcc官方发邮件。听听他们是怎么说的。

这个大佬大概说了这些:
- 首先肯定的是 linux gcc 没有默认对齐数。
- 如果他们设置了默认对齐数,可能会对其他编译器产生不兼容的问题。
- 其他的系统要求的对齐可能不相同,所以他们在 mingw-gcc on windows 做了一些改变。
- 最后就是轻喷了一下CSDN的小伙伴们,意思是让我们以后写博客要多测试测试一些数据,不要就测试几组就相信一些结论,然后让别人接收错误的信息。
叮~?