gpt4 book ai didi

c++ - 优化编译器能否从 std::unique_ptr 中移除所有运行时成本?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:21:43 25 4
gpt4 key购买 nike

阅读关于 std::unique_ptrhttp://en.cppreference.com/w/cpp/memory/unique_ptr ,我天真的印象是,一个足够聪明的编译器可以用裸指针替换 unique_ptr 的正确使用,并在 unique_ptr 时放入一个 delete被摧毁。事实真的如此吗?如果是这样,是否有任何主流优化编译器真的这样做了?如果不是,是否可以编写一些具有 unique_ptr 的部分/全部编译时安全优势的东西,可以优化为没有运行时成本(空间或时间)?

注意那些(适本地)担心过早优化的人:这里的答案不会阻止我使用 std::unique_ptr,我只是好奇它是一个非常棒的工具还是只是一个真棒。

编辑 2013/07/21 20:07 EST:

好的,所以我用下面的程序进行了测试(如果有问题请告诉我):

#include <climits>
#include <chrono>
#include <memory>
#include <iostream>

static const size_t iterations = 100;

int main (int argc, char ** argv) {
std::chrono::steady_clock::rep smart[iterations];
std::chrono::steady_clock::rep dumb[iterations];
volatile int contents;
for (size_t i = 0; i < iterations; i++) {
auto start = std::chrono::steady_clock::now();
{
std::unique_ptr<int> smart_ptr(new int(5));
for (unsigned int j = 0; j < UINT_MAX; j++)
contents = *smart_ptr;
}
auto middle = std::chrono::steady_clock::now();
{
int *dumb_ptr = new int(10);
try {
for (unsigned int j = 0; j < UINT_MAX; j++)
contents = *dumb_ptr;
delete dumb_ptr;
} catch (...) {
delete dumb_ptr;
throw;
}
}
auto end = std::chrono::steady_clock::now();
smart[i] = (middle - start).count();
dumb[i] = (end - middle).count();
}
std::chrono::steady_clock::rep smartAvg;
std::chrono::steady_clock::rep dumbAvg;
for (size_t i = 0; i < iterations; i++) {
smartAvg += smart[i];
dumbAvg += dumb[i];
}
smartAvg /= iterations;
dumbAvg /= iterations;

std::cerr << "Smart: " << smartAvg << " Dumb: " << dumbAvg << std::endl;
return contents;
}

使用 g++ --std=c++11 -O3 test.cc 用 g++ 4.7.3 编译得到 Smart: 1130859 Dumb: 1130005,这意味着智能指针在哑指针的 0.076% 以内,这几乎可以肯定是噪声。

最佳答案

这肯定是我对任何有能力的编译器的期望,因为它只是一个简单指针的包装器和一个调用 delete 的析构函数,因此编译器生成的机器代码用于:

x *p = new X;
... do stuff with p.
delete p;

unique_ptr<X> p(new X);
... do stuff with p;

将是完全相同的代码。

关于c++ - 优化编译器能否从 std::unique_ptr 中移除所有运行时成本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17777287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com