2016-08-09 5 views
1

クラスに対してコンストラクタが宣言されていない場合は、コンパイラによって生成されるコンストラクタがありません。以下の(G ++または打ち鳴らす++)をコンパイルし、このコードでnm -Cを行った後しかし 、 - 非PODのデータメンバを持っている - 私は、生成されたCTORを参照してください行います - PODとPODで生成されたコンストラクタと非PODの場合

class X 
{ 
public: 
    void SetName(std::string name) {m_name = name;} 
private: 
    std::string m_name; 
}; 

int main() 
{ 
    X x1; 
    x1.SetName("jude"); 

    return 0; 
} 

しかし、このコードでデータメンバ - 私にはありません。

class X 
{ 
public: 
    void SetNum(int num) {m_x = num;} 
private: 
    int m_x; 
}; 

int main() 
{ 
    X x1; 
    x1.SetNum(8); 

    return 0; 
} 

私は両方のケースで生成されたコンストラクタを見るだろうと思いました。この動作は標準に準拠していますか?それとも、ここで何が起こっているのでしょうか? m_nameが構築デフォルトする必要があるよう

class X 
{ 
public: 
    void SetName(std::string name) {m_name = name;} 
private: 
    std::string m_name; 
}; 

の場合

答えて

4

コンストラクタが生成されなければなりません。

class X 
{ 
public: 
    void SetNum(int num) {m_x = num;} 
private: 
    int m_x; 
}; 

の場合m_xを構築デフォルトでは、変数が初期化されないままにされると何もしないことと同じです。コンストラクタを生成したり呼び出すことはコンストラクタと同じことをしないので、コンパイラは"as-if" ruleの下でそれを最適化できます。

+0

この最適化を無効にするために使用できるコンパイル\リンクフラグはありますか? – HeyJude

+0

@HeyJudeわかりません。最適化を無効にすると効果的ですが、実際には解決策ではありません。あなたは本当にコンストラクタが必要ですか?それは非オペアンプです。 – NathanOliver

+0

@HeyJude .oファイルを生成するだけでmain()でコードをコンパイルし、それらをチェックすることができます。 – Walter

0

出力はであり、as-ifルールでバインドされたではなくです。覚えておいてください。inlineはコンパイラのヒントに過ぎず、関数の複雑さを含め、他のヒントも使用できます。明らかに、これらの2つのコンストラクタは複雑さが異なります。実際、PODの場合、生成されたctorは文字通り些細なものであり、コンパイラがインライン化することはまったく妥当です。

関連する問題