gpt4 book ai didi

c++ - 数组初始化优化

转载 作者:IT老高 更新时间:2023-10-28 12:37:30 25 4
gpt4 key购买 nike

编译以下代码片段时(clang x86-64 -O3)

std::array<int, 5> test()
{
std::array<int, 5> values {{0, 1, 2, 3, 4}};
return values;
}

It produced我期望的典型程序集

test():                               # @test()
mov rax, rdi
mov ecx, dword ptr [rip + .L__const.test().values+16]
mov dword ptr [rdi + 16], ecx
movups xmm0, xmmword ptr [rip + .L__const.test().values]
movups xmmword ptr [rdi], xmm0
ret
.L__const.test().values:
.long 0 # 0x0
.long 1 # 0x1
.long 2 # 0x2
.long 3 # 0x3
.long 4 # 0x4

不过对于小数组,似乎已经想出一招了?

std::array<int, 3> test()
{
std::array<int, 3> values {{0, 1, 2}};
return values;
}

This是对应的程序集

test():                               # @test()
movabs rax, 4294967296
mov edx, 2
ret

那个神奇的数字 (4294967296) 是从哪里来的?这本质上是一个可以以某种方式 reinterpret_cast 回到 int 数组的值吗?

最佳答案

一个 std::array<int, 3>在您的实现中是 96 位宽。因此,ABI 声明它应该在 RAX + RDX 的低 32 位(又名 EDX)中返回。

4294967296 是 232,十六进制是 $1'0000'0000 .所以movabs在 RAX 的低 32 位中存储 0,在 RAX 的高位中存储 1。 mov将 2 存储在 EDX 中(这正是您想要的)。

关于c++ - 数组初始化优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56668186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com