Tôi luôn cảm thấy rằng std::unique_ptr
không có chi phí nào so với việc sử dụng con trỏ thô. Tuy nhiên, biên dịch đoạn mã sauTại sao biên dịch instant_ptr biên dịch thành nhị phân lớn hơn con trỏ thô?
#include <memory>
void raw_pointer() {
int* p = new int[100];
delete[] p;
}
void smart_pointer() {
auto p = std::make_unique<int[]>(100);
}
với g++ -std=c++14 -O3
sản xuất lắp ráp như sau:
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*)
Tại sao là đầu ra cho smart_pointer()
gần gấp ba lần lớn như raw_pointer()
?
Nó có bộ đếm có liên quan và có thể là một chi phí nhỏ. Có lẽ một vtable –
Tôi thực sự ngạc nhiên toàn bộ điều không được tối ưu hóa hoàn toàn đi. – SergeyA
@SergeyA Với clang nó được. –