2017-06-21 9 views
5

通常の代わりにconstexprを使用してオブジェクトを作成するとパフォーマンスが向上するかどうかを調べようとしています。オブジェクトを作成するためのConstexpr

constexprのコードスニペットは次のとおりです。

class Rect 
{ 
    const int a; 
    const float b; 
public: 
    constexpr Rect(const int a,const float b) 
    : a(a),b(b){} 
}; 

int main() 
{ 
    constexpr Rect rect = Rect(1,2.0f); 
} 

constexprなし。

class Rect 
{ 
    int a; 
    float b; 
public: 
    Rect(int a, float b) 
    : a(a),b(b){} 
}; 

int main() 
{ 
    Rect rect = Rect(1,2.0f); 
} 

私はメモリは、コンパイル時に初期化されなければならないので、constexprのためのはるかに少ないコードがあるだろう期待していました。

constexprを正しく使用していますか?それが真実でない場合は、constexprを使用してコンパイル時にオブジェクトを作成し、ランタイムオーバーヘッドなしでそれらを使用できますか?

ありがとうございます!

+5

_「constexprの指定子は、それはコンパイル時に関数や変数の値を評価する__possible__であることを宣言します」 _出典:http://en.cppreference.com/w/cpp/language/constexpr。コンパイル時に評価する必要はありません。 'rect rect = Rect(1,2.0f);を' constexpr rect rect {1,2.0f} 'に変更してみてください。 –

+0

なぜdownvoteですか?これはよく書かれていて、明らかではありません(少なくとも私にとってではありません)。 – Bathsheba

+4

あなたが 'rect'を使って何もしないので、最適化をオンにしたときに違いが出ないので、削除されます(https://godbolt.org/g/hQxTnU)。あなたは 'constexpr'を使用しません。あなたはコードなしで効率的になることはできません! – cdhowie

答えて

0

コードの類似性の原因となったヘッダーがいくつか含まれていました。

答えは、両方のケースで大きな違いがあるということです。

最適化せずにコンパイルし、生成されたコードでthere is a substantial difference ... -cdhowie

関連する問題