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

亚历山德罗·鲍尔(Alessandro Power):

我总是觉得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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么常量名称会出现在已编译的二进制文件/共享库中?

将仅在测试文件中引用的测试代码编译为二进制文件吗?

执行实际上在x86_64机器上编译为i686机器的二进制文件有什么限制?

为什么“链接时间优化”会导致二进制文件更大?

为什么使用HsColour二进制文件的存在/不存在会强制重新编译QuickCheck库?

为什么git索引文件是二进制的?

std :: transform中的二进制运算符,带有unique_ptr向量

cat为什么更改二进制文件的内容?

dart支持编译为二进制代码吗?

将ffmpeg编译为独立的二进制文件

静态指针的二进制实例

使用Bazel将二进制文件编译为多个版本的.NET Framework

在编译为二进制文件时在perl 5.28上进行perlcc编译时出错

有什么办法可以将Google protobuf二进制文件(.pb文件)反编译为.proto文件

为什么“二进制文件”不在原始二进制文件中?

为什么许多项目不提供预编译的二进制文件?

是否可以将R脚本编译为二进制文件?

为什么编译后我们不能理解二进制文件的内容?

如何测试Linux二进制文件是否被编译为位置无关代码?

为什么默认情况下不使用gcc编译二进制文件

将多个程序编译为一个二进制文件以节省空间

符号链接会发生什么?原始二进制文件和符号二进制文件的行为不同

我编译器生成的二进制文件不仅仅包含二进制数,为什么?

为什么某些Linux二进制文件需要重新编译?

在Mac上将Python3编译为二进制可执行文件

为什么忽略二进制文件是最佳做法?

为什么我编译的 C++ 二进制文件不能执行?

为什么使用 git 从 powershell 复制的二进制文件与原始文件不同?

Go:使用 PIE 编译为静态二进制文件