Linux gcc没有默认对齐数(内赋gcc官方大佬邮件)

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的小伙伴们,意思是让我们以后写博客要多测试测试一些数据,不要就测试几组就相信一些结论,然后让别人接收错误的信息。

叮~?

  • 23
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值