2012-09-04 6 views
6

私は "namespace std"を使うべきではなく、代わりにstd名前空間の呼び出しを使うために "std :: cout"を使うべきであると教えられたセッションに出席しました。バイナリのサイズを増やすことになります名前空間の包含はexeのサイズを増やす

以下の実験でも同じことを試してみました。次のようにコード&その出力は次のようになります -

[[email protected]]$ 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; 

    } 


    [[email protected]]$ time g++ -c namespacestd.cpp -DSTD 

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

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

    [[email protected]]$ time g++ -o namespacestd namespacestd.cpp -DSTD 

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

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

私は

はバイナリ

のみ

の大きさには影響がないというのが私の実験からわかるようにコンパイル時にに違いがあります。私の結論は、ほとんどのコンパイラとのバイナリサイズに影響を及ぼすべきではない名前空間stdを使用して

おかげ

+0

コンパイル時間に違いがあるかもしれませんが( '使用するともっと多くの作業が行われる可能性があります)、それは非常に理論的です... –

+0

コンパイル時間の違いについてはあまり気にしません。反復試験は一貫した差異を示す。 'g ++ 'は、そのプログラムをコンパイルするために少なくとも数十のファイルに当てはまり、タイミングが変わる可能性があります。 –

+0

私はコンパイル時間が無関係であることに同意します – Fooo

答えて

3

不備であれば

は親切に私を修正します。別の理由でそれでも回避する必要があります:

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

も、この関連の質問を参照してください:Why is "using namespace std" considered bad practice?

2

バイナリ

の大きさには影響は両方のケースであるため、実行可能なコードとデータに違いがあるべきではありませんありません同じオブジェクトに対して同じことをやっているし、その名前からそのオブジェクトを見つけるルックアッププロセスは、コンパイル時に起こります。しかし、状況によっては、デバッグ情報など、さまざまな量のメタデータを生成する可能性があります。

は潜在的にコンパイル時間を変更することができ、コンパイル時間

ソースへの変更に差があるが、あなたは差は統計的に有意であるかどうかを判断するために十分なデータを提示していません。それぞれの構成に対して数回の実験を繰り返し、2つのサンプルの平均と分散を計算し、平均の差に有意差検定を適用する必要があります。あなたがグローバルな名前空間を汚染することは、分数速くコンパイルを行い、保存された任意の時間が潜在的に名前の衝突を追跡する無駄な時間に比べて小さなだろうと判断しても、いずれにしても

、。 std名前空間には多くの名前がありますが、その多くは独自のコードで使用することをお勧めします。これが名前空間の汚染を避ける理由です。バイナリのサイズに影響すると主張する人は、彼らが何を話しているのかを完全には理解していません。

2

バイナリは同じものではありません。これは、STDが定義されていて、別のSTDが定義されているためです。私はまた、さまざまなサイズを取得します。

しかし、stripシンボルの場合、ほぼ同じバイナリを得ることになります(コンパイル時のようないくつかの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は非常に強力で、私はこの時間の増加を無視するだけです。

2

は、私は、これは、バイナリのサイズを大きくするものとして、代わりにstd名前空間のいくつかの呼び出しを使用するための「STD :: coutを」を行う、それは我々が「名前空間stdを使用して、」使うべきではないことを教えられたセッションに出席しました。

非常に良いアドバイス、ナンセンスの根拠。その根拠は早すぎる最適化であり、起動するのは間違いです。

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

ソースファイルでさえ、多くの人がコードを読みやすく、理解しやすく、エラーを起こしにくくするため、std::whateverを好んでいます。文字の入力が数文字で済むようになると、std::のプレフィックスは、永遠にコンパイラに意図を伝達し、さらに重要なことに、コードの人間の読者/人間の保守者に伝えます。コードが標準ライブラリから何かを呼び出すのは間違いありません。

using namespace <namespace_name>;ディレクティブを使用する唯一の正当な理由は、タイピングの数文字を節約するためにプログラマ側で怠惰であることです。入力のそれらのいくつかの保存された文字は莫大な費用で来る。

関連する問題