c++ - आरंभीकरण अनुकूलन अनुकूलन



x86-64 compiler-optimization (1)

निम्न कोड स्निपेट संकलित करते समय (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;
}

This इसी विधानसभा थी

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

वह जादू नंबर ( 4294967296 ) कहां से आया? क्या यह अनिवार्य रूप से एक मूल्य है जो किसी भी तरह से int की एक सरणी में वापस reinterpret_cast हो सकता है?


आपके कार्यान्वयन पर एक std::array<int, 3> 96 बिट्स चौड़ा है। जैसा कि ABI ने घोषणा की है कि इसे RAX + में आरडीएक्स के कम 32 बिट्स (उर्फ EDX) को लौटाया जाना चाहिए।

4294967296 2 32 है , हेक्स में यह $1'0000'0000 । इसलिए movabs को कम क्रम में 0 RAX के 32 बिट्स, और RAX के उच्च क्रम बिट्स में 0 स्टोर किया जाता है। EDX में मूव 2 स्टोर (जो वास्तव में आप चाहते थे)।





abi