6

「usingnamespacestd」を使用するのではなく、「std :: cout」を使用してstd名前空間の呼び出しを使用する必要があると教えられたセッションに参加しました。これにより、バイナリのサイズが大きくなります。

次の実験で同じことを確認してみました。コードとその出力は次のとおりです。-

    [Fooo@EXP]$ cat namespacestd.cpp
    #include<iostream>

    #ifdef STD
            using namespace std;
    #endif

    int main()
    {
    #ifndef STD
            std::cout<<"\n ==> Workign \n";
    #else
            cout<<"\n ==> Workign \n";
    #endif

    return 0;

    }


    [Fooo@EXP]$ time g++ -c namespacestd.cpp -DSTD

    real    0m0.246s
    user    0m0.215s
    sys     0m0.030s
    [Fooo@EXP]$ size namespacestd.o
       text    data     bss     dec     hex filename
        310       8       1     319     13f namespacestd.o  
    [Fooo@EXP]$ time g++ -c namespacestd.cpp

    real    0m0.258s
    user    0m0.224s
    sys     0m0.034s
    [Fooo@EXP]$ size namespacestd.o
       text    data     bss     dec     hex filename
        310       8       1     319     13f namespacestd.o

    [Fooo@EXP]$ time g++ -o namespacestd namespacestd.cpp -DSTD

    real    0m0.293s
    user    0m0.251s
    sys     0m0.042s
    [Fooo@EXP]$ size namespacestd
       text    data     bss     dec     hex filename
       1980     580     288    2848     b20 namespacestd
    [Fooo@EXP]$ time g++ -o namespacestd namespacestd.cpp

    real    0m0.274s
    user    0m0.239s
    sys     0m0.035s
    [Fooo@EXP]$ size namespacestd
       text    data     bss     dec     hex filename
       1980     580     288    2848     b20 namespacestd
    [Fooo@EXP]$

私の実験からわかるように、

バイナリのサイズには影響しません

それだけ

コンパイル時間に違いがあります。

私の結論に欠陥がある場合は、親切に訂正してください

ありがとう

4

4 に答える 4

3

名前空間stdを使用しても、ほとんどのコンパイラでバイナリサイズに影響を与えることはありません。それでも別の理由で避ける必要があります:

名前空間stdは本当に大きいです。そこには文字通り何千もの識別子があり、それらはすべてプログラムの範囲内にあります。これにより、自分の識別子または他のライブラリの識別子との衝突の可能性が高まり、厄介な驚きを引き起こす可能性があります。

この関連する質問も参照してください:「名前空間stdの使用」が悪い習慣と見なされるのはなぜですか?

于 2012-09-04T10:45:54.013 に答える
2

バイナリのサイズには影響しません

どちらの場合も同じオブジェクトに対して同じことを行っており、その名前からそのオブジェクトを見つけるためのルックアッププロセスはコンパイル中に行われるため、実行可能コードとデータに違いはありません。ただし、状況によっては、デバッグ情報など、異なる量のメタデータを生成する可能性があります。

コンパイル時間に違いがあります

ソースを変更するとコンパイル時間が変更される可能性がありますが、その差が統計的に有意であるかどうかを判断するのに十分なデータが提示されていません。構成ごとに実験を数回繰り返し、2つのサンプルの平均と分散を計算し、平均の差に有意性検定を適用する必要があります。

いずれにせよ、グローバル名前空間を汚染するとコンパイルがわずかに速くなると判断したとしても、名前の衝突を追跡するために無駄になる可能性のある時間と比較して、節約される時間はごくわずかです。名前空間には多くの名前がありstd、その多くを独自のコードで使用することをお勧めします。これが、名前空間の汚染を回避する理由です。バイナリのサイズに影響を与えると主張する人は、彼らが何について話しているのかを完全には理解していません。

于 2012-09-04T10:54:51.887 に答える
2

バイナリは同じではありません。1つはSTDを定義しており、もう1つは定義していないためです。サイズも違います。

ただし、シンボルを削除すると、ほぼ同じバイナリが取得されます(コンパイル時間など、一部のELFヘッダーパラメータが異なります)。

あなたがあなたの例をこれに変えるならば:

#include<iostream>

    using namespace std;


    int main()
    {
    #if 0
            std::cout<<"\n ==> Workign \n";
    #else
            cout<<"\n ==> Workign \n";
    #endif

    return 0;

    }

次に、とを使用してコンパイルする#if 1#if 0、シンボルをストライピングしなくても、同じサイズのバイナリを取得できます。

コンパイル時間の違いは正常です。マクロを定義すると、ファイルが大きくなり、プリプロセッサはさらに多くのことを実行する必要があります。ただし、新しいPCは非常に強力なので、今回の増加は無視します。

于 2012-09-04T10:59:11.950 に答える
2

「usingnamespacestd」を使用するのではなく、「std :: cout」を使用してstd名前空間の呼び出しを使用する必要があると教えられたセッションに参加しました。これにより、バイナリのサイズが大きくなります。

非常に良いアドバイス、ナンセンスな理論的根拠。その理論的根拠は時期尚早の最適化であり、起動するのは間違っています。

using namespace std;ヘッダーファイルでは絶対に使用しないでください。ヘッダーファイル内のそのディレクティブは、ヘッダーファイルをインクルードするstdすべてのファイルの名前空間からのアイテムでグローバル名前空間を汚染します。

ソースファイルであってもstd::whatever、コードが読みやすく、理解しやすく、エラーが発生しにくいため、多くの人が好みます。数文字の入力という1回限りのコストで、そのstd::プレフィックスはコンパイラに、さらに重要なことに、コードの人間の読者/人間のメンテナに意図を永久に伝えます。コードが標準ライブラリから何かを呼び出していることは間違いありません。

ディレクティブを使用する唯一の理由はusing namespace <namespace_name>;、タイピングの数文字を節約するためのプログラマー側の完全な怠惰です。タイピングのこれらのいくつかの保存された文字は、多大な費用がかかります。

于 2012-09-04T12:23:12.350 に答える