我总是觉得std::unique_ptr
与使用原始指针相比,a 没有开销。但是,编译以下代码
#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()
几乎是三倍的raw_pointer()
?
因为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()
-见之间的std :: make_unique和std ::的unique_ptr差异。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句