为什么unique_ptr实例化编译为比原始指针更大的二进制?

Ale*_*wer 39 c++ assembly smart-pointers

我总是认为std::unique_ptr与使用原始指针相比没有任何开销.但是,编译以下代码

#include <memory>

void raw_pointer() {
  int* p = new int[100];
  delete[] p;
}

void smart_pointer() {
  auto p = std::make_unique<int[]>(100);
}
Run Code Online (Sandbox Code Playgroud)

with g++ -std=c++14 -O3生成以下程序集:

raw_pointer():
        sub     rsp, 8
        mov     edi, 400
        call    operator new[](unsigned long)
        add     rsp, 8
        mov     rdi, rax
        jmp     operator delete[](void*)
smart_pointer():
        sub     rsp, 8
        mov     edi, 400
        call    operator new[](unsigned long)
        lea     rdi, [rax+8]
        mov     rcx, rax
        mov     QWORD PTR [rax], 0
        mov     QWORD PTR [rax+392], 0
        mov     rdx, rax
        xor     eax, eax
        and     rdi, -8
        sub     rcx, rdi
        add     ecx, 400
        shr     ecx, 3
        rep stosq
        mov     rdi, rdx
        add     rsp, 8
        jmp     operator delete[](void*)
Run Code Online (Sandbox Code Playgroud)

为什么输出smart_pointer()几乎是三倍raw_pointer()

Hol*_*olt 53

因为std::make_unique<int[]>(100)执行值初始化new int[100]执行缺省初始化 -在第一种情况下,元素都是0的初始化(对于int),而在第二种情况下元件左初始化.尝试:

int *p = new int[100]();
Run Code Online (Sandbox Code Playgroud)

并且你将得到与之相同的输出std::unique_ptr.

例如,请参阅此信息,该信息表示std::make_unique<int[]>(100)相当于:

std::unique_ptr<T>(new int[100]())
Run Code Online (Sandbox Code Playgroud)

如果你想要一个非初始化的数组std::unique_ptr,你可以使用1:

std::unique_ptr<int[]>(new int[100]);
Run Code Online (Sandbox Code Playgroud)

1如前所述通过@Ruslan的意见,要知道之间的差异std::make_unique()std::unique_ptr()-看到的std :: make_unique和std ::的unique_ptr之间的差异.

  • @AlessandroPower但要注意[std :: make_unique和std :: unique_ptr之间的差异](http://stackoverflow.com/q/22571202/673852). (3认同)
  • @AlessandroPower`std :: unique_ptr <int []>(new int [100])`. (2认同)