c++ - unique_ptr赋值 - unique_ptr swap



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

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

int *p = new int[100]();

并且您将获得与std::unique_ptr相同的输出。

例如,请参阅,其中说明std::make_unique<int[]>(100)等效于:

std::unique_ptr<T>(new int[100]())

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

std::unique_ptr<int[]>(new int[100]);

1正如@Ruslan在评论中所提到的,请注意std::make_unique()std::unique_ptr() @Ruslan - 请参阅@Ruslan

我总是认为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);
}

使用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*)

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





smart-pointers