【发布时间】:2017-03-30 19:50:54
【问题描述】:
我一直认为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() 的输出几乎是raw_pointer() 的三倍?
【问题讨论】:
-
我真的很惊讶整个事情没有完全优化。
-
@SergeyA 叮当响。
-
是的,我正在同时检查它。看起来 CLang 开始使用 gcc 进行优化。
-
@SergeyA 如果它是单独编译的,我猜编译器必须允许您重载
new和delete以产生其他副作用? -
@EdHeal 计数器?虚拟表?这并不真正适用于
std::unique_ptr,是吗?
标签: c++ assembly smart-pointers