6

http://en.cppreference.com/w/cpp/memory/unique_ptrを読んstd::unique_ptrで、私の素朴な印象は、十分に賢いコンパイラが正しい使用法を裸のポインターに置き換え、 s が破壊されたときに a を入れるだけであるということです。これは実際にそうですか?もしそうなら、主流の最適化コンパイラは実際にこれを行っていますか? そうでない場合、 (スペースまたは時間の) ランタイム コストがかからないように最適化できる、コンパイル時の安全性の利点の一部またはすべてを備えたものを作成することは可能でしょうか?unique_ptrdeleteunique_ptrunique_ptr

時期尚早の最適化について(適切に)心配している人への注意:ここでの答えはstd::unique_ptr、私が を使用するのを止めるものではありません.

編集 2013/07/21 20:07 EST:

OK、次のプログラムでテストしました(これに何か問題がある場合はお知らせください):

#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.ccgiven を使用して g++ 4.7.3 でコンパイルしますSmart: 1130859 Dumb: 1130005。これは、スマート ポインターがダム ポインターの 0.076% 以内にあることを意味します。これはほぼ確実にノイズです。

4

2 に答える 2