在编译以下代码片段时(clang x86-64 -O3
)
std::array<int, 5> test()
{
std::array<int, 5> values {{0, 1, 2, 3, 4}};
return values;
}
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;
}
这里 是相应的汇编代码
test(): # @test()
movabs rax, 4294967296
mov edx, 2
ret
这个神奇的数字(4294967296
)从哪里来?它是不是可以通过reinterpret_cast
重新转换回一个int
数组的值?