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之间的差异.