簡體   English   中英

數組初始化優化

[英]Array initialization optimization

編譯以下代碼片段時(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數組嗎?

std::array<int, 3>在您的實現上是96位寬。 因此,ABI聲明它應該在RAX + RDX的低32位(也稱為EDX)中返回。

4294967296是2 32 ,十六進制是$1'0000'0000 因此, movabs在RAX的低位32位存儲0,在RAX的高位位存儲1。 mov在EDX中存儲了2個(這正是你想要的)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM