При компиляции следующего фрагмента кода (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
?