c++ - অ্যারে প্রাথমিকীকরণ অপ্টিমাইজেশান



x86-64 compiler-optimization (1)

একটি std::array<int, 3> আপনার বাস্তবায়নের জন্য 96 বিট প্রশস্ত। যেমন এবিআই ঘোষণা করে যে এটি RAX + র RDX (ঊর্ধ্বতন EDX) এর কম 32 বিটগুলিতে ফেরত দেওয়া উচিত।

4294967296 2 32 , $1'0000'0000 এটি $1'0000'0000 । তাই movabs কম অর্ডার 32 বিট RAX, এবং 1 RAX উচ্চ অর্ডার বিট মধ্যে সঞ্চয়। EDX এ মুভি স্টোর 2 (যা আপনি ঠিক কি চেয়েছিলেন)।

নিম্নলিখিত কোড স্নিপেট কম্পাইল করার সময় ( -O3 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

তবে ছোট অ্যারে জন্য, এটি একটি কৌতুক figured আছে বলে মনে হচ্ছে?

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 একটি অ্যারে reinterpret_cast ফিরে যেতে পারে যে একটি মান?





abi