std::unique_ptr
在http://en.cppreference.com/w/cpp/memory/unique_ptr上阅读,我天真的印象是,足够聪明的编译器可以用裸指针替换正确的使用,并在s 被破坏时unique_ptr
放入 a 。真的是这样吗?如果是这样,是否有任何主流优化编译器实际上这样做?如果没有,是否有可能编写具有部分/全部编译时安全优势的东西,可以优化为没有运行时成本(空间或时间)?delete
unique_ptr
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++ 4.7.3 编译时使用 given g++ --std=c++11 -O3 test.cc
,Smart: 1130859 Dumb: 1130005
这意味着智能指针在哑指针的 0.076% 以内,这几乎肯定是噪音。