C/C++ループ内またはループ外定義変数のどちらが良いですか?

1218 ワード

質問:
//    A:
Widget w;
for (int i = 0; i < n; ++i) {
    w =     i     ;
}

//    B:
for (int i = 0; i < n; ++i) {
    Widget w(    i     );
}

Effective C++条項26には、1つの付与コストが1組の構造+プロファイルコストより低い場合、定義はサイクル外(すなわちA)で効率的であり、そうでなければサイクル内(すなわちB)で定義したほうがよいという話がある.私の問題は、どのような状況で付与コストが構造+分析コストのセットより低いかということです.
 
回答:
これはもっと2つの状況を考えるべきだと思います.変数の役割ドメイン、これはもっと重要です.Aの場合、wの生存サイクルはサイクルの外で引き続き存在しますが、Bはできません.最適化の問題を早く考えないでください.今のコンパイラはあなたが想像していたよりも頭がいいです.
C++にとって、RAI(Resource Acquisition Is Initialization)を崇拝し、使用する場合は定義を直接宣言します.例えばAの場合、もし私がwを付与する前に検出ロジックがあり、満足しなければ、私は直接異常を投げ出すと、以下のようにwを構築する代価を負担する必要があります.
Widget w;
for (int i = 0; i < n; ++i) {
    if(some condition)
    {
       throw std::exception("haha");
    } 
    w =     i     ;
}

ただし、使用時に直接宣言して定義する場合は、次のような問題はありません.
for (int i = 0; i < n; ++i) {
    if(some condition)
    {
       throw std::exception("haha");
    } 
    Widget w(i);
}

このように、異常が投げ出されても、無駄な構造wを構築するコードは引き受けられない.
だから、C++コードを書く時、C 89の先に声明を忘れて、後で定義するやり方ではなく、RAIを考慮しなければならない.
 
原文リンク:ループ内またはループ外定義変数?-青い答えhttps://www.zhihu.com/question/36125544/answer/66031885