为什么 gcc5 下的 new operator 可以得到 32 byte 对齐的地址(在 x86-64 机器上) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
midasplus
V2EX    C++

为什么 gcc5 下的 new operator 可以得到 32 byte 对齐的地址(在 x86-64 机器上)

  •  
  •   midasplus 2022 年 1 月 5 日 1798 次点击
    这是一个创建于 1488 天前的主题,其中的信息可能已经有所发展或是发生改变。

    stackoverflow 的提问参考这里

    从查阅到的资料中看出,在 x86-64 机器上,gcc 的 new operator 应该是只有 16 byte 对齐的,直到 gcc7 的 c++17 下,由于引入了 aligned new ,才支持更大的对齐 size.

    但是我实际发现,gcc5 下得到的地址就已经是 32 byte 对齐了。 测试代码在这里: gcc4.9, gcc5.1

    代码跑了上万次,每一次 gcc5 下得到的结果都是 32 byte 对齐,感觉不像是巧合

    然后参考了这个帖子, 猜测是 glibc 或者 libstdc++中有相关的更改。

    发现 gcc4.9 和 gcc5.1 的 glibc 版本都是 2.19 libstdc++的版本倒是不同,一个是 6.0.20 ,一个是 6.0.21

    但是去看了 libstdc++的代码,没有发现和 Gcc5 有关的变更

    所以我的问题是,gcc5 下得到的地址有 32 byte 对齐是不是巧合? 是巧合的话,如何能复现出只有 16 byte 对齐的情况? 不是巧合的话, 为什么 gcc4.9 和 gcc5 的行为不一致?

    9 条回复    2022-01-12 10:08:45 +08:00
    3dwelcome
        1
    3dwelcome  
       2022 年 1 月 5 日
    不懂,你代码里写了 alignas(32)关键字,那就是期望 32 位内存对齐啊。

    把关键字去掉,就不是这个结果了。

    当然那现在内存不值钱,多浪费点空间没什么。然而对齐了,指令性能和移动端的可移植性,都能得到提升。
    yokyj
        2
    yokyj  
       2022 年 1 月 5 日
    tql
    midasplus
        3
    midasplus  
    OP
       2022 年 1 月 5 日
    @3dwelcome 在 gcc4.9 下,这个期望是得不到足的。 就算写了 alignnas(32),得到的地址也只有 16 byte 对齐。
    midasplus
        4
    midasplus  
    OP
       2022 年 1 月 5 日
    @yokyj 太菜了
    3dwelcome
        5
    3dwelcome  
       2022 年 1 月 5 日
    gcc4.9 以前一直有对齐关键字,叫__declspec(align(32)),这是很早以前就支持的。

    alignnas 这个应该是新编译器才支持的。
    midasplus
        6
    midasplus  
    OP
       2022 年 1 月 5 日
    @3dwelcome 可能我的示例代码有些让人困惑。 我原始的问题是,gcc4.9 下 new 出来的地址是 16 byte 对齐,但是 gcc5 下 new 出来的地址是 32 byte 对齐。 原始问题其实是在使用 avx2 指令时遇到的。avx2 指令要求 32 byte 对齐。如下代码在 Gcc4.9 下由于对齐问题会发生 core ,但是在 gcc5 下不会。
    https://godbolt.org/z/xKMYWThYo
    midasplus
        7
    midasplus  
    OP
       2022 年 1 月 7 日
    up
    mingl0280
        8
    mingl0280  
       2022 年 1 月 12 日
    @111qqz GCC4.9 是不是不支持 alignas ?
    midasplus
        9
    midasplus  
    OP
       2022 年 1 月 12 日
    @mingl0280 感觉和 alignas 可能没什么关系? 因为最初的问题其实是在 Gcc4.9 下使用 avx2 指令。Avx2 指令需要 32 位对齐但是 gcc4.9 下只能提供 16 位对齐,导致会发生 core. 可以参考我 6 楼中的代码。 我换了个例子是不想 simd 相关的内容影响问题本身
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1016 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 18:22 PVG 02:22 LAX 10:22 JFK 13:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86