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

C++ 为什么unique_ptr实例化编译成比原始指针更大的二进制文件?,c++,assembly,smart-pointers,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); } 为什么smart\u pointer()的输出几乎是raw\u pointer()的三倍

我总是觉得与使用原始指针相比,
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);
}

为什么
smart\u pointer()
的输出几乎是
raw\u pointer()
的三倍?

因为
std::make\u unique(100)
在执行
new int[100]
时执行-在第一种情况下,元素是0初始化的(对于
int
),而在第二种情况下,元素是未初始化的。尝试:

int *p = new int[100]();
您将获得与使用
std::unique\u ptr
相同的输出

例如,请参见,其中指出
std::make_unique(100)
相当于:

std::unique_ptr<T>(new int[100]())

1如评论中所述,请注意
std::make_unique()
std::unique_ptr()
-请参阅。

我怀疑可能是这样。有没有办法创建一个指向未初始化数组的
unique\u ptr
呢?@AlessandroPower
std::unique\u ptr(new int[100])
@AlessandroPower但是要小心。我真的很惊讶整个事情没有完全优化。@SergeyA和clang是的。是的,我同时也在检查它。看起来CLang开始在优化方面与gcc合作。@SergeyA如果单独编译,我想编译器必须考虑到您重载
new
delete
可能会产生其他副作用?@EdHeal Counter?Vtable?这实际上不适用于std::unique\u ptr,是吗?
std::unique_ptr<T>(new int[100]())
std::unique_ptr<int[]>(new int[100]);