1

C++11 の type_traits を理解しようとしています。私が理解していることから、コンパイル時の型決定が可能になります。したがって、次の場合に何が起こるかを知りたいです。

単純なテンプレート クラスがあるとします。

template<class T>
class A {
    public:
        int num = 0;
        A() {
           if (is_integral<T>::value)
                num = 5;
        }
}

インスタンス化A<int> aを 100 回行っているとします。これは、オブジェクトを作成するたびに、if ブロックがコンストラクターで呼び出されることを意味しますか? または、コンパイラはコンパイル中に if ブロックを削除 (最適化) しますか? 質問をさらに明確にする必要があるかどうか尋ねてください。

4

2 に答える 2

1

または、コンパイラはコンパイル中に if ブロックを削除 (最適化) しますか?

はい、is_integralテンプレート クラスでありvalue、そのクラスの public static メンバー定数です。コンパイラーは、定数を使用する if ステートメントを簡単に除去できます (少なくとも最適化をオンにすると除去します)。

http://en.cppreference.com/w/cpp/types/is_integral

于 2013-05-26T06:43:14.970 に答える
1

if定数値を取得します。テンプレートのインスタンス化後、 になりif ( false )ます。の命令n = 5がアプリケーション バイナリから省略されるかどうかは、実装によって定義されます。確かに、最適化を有効にすると、デッド コードは削除されますが、コンパイラは、デバッグまたは遅延のためにデッド コードをそのままにしておくことができます。

if ( false )もしないことを意味するので、そうです、確かに何も起こりません。通常、最適化によってプログラムの動作が変わることはありません。また、それがゼロサイクルで起こることも安全な賭けです. コンパイラは、おそらくデバッグ モードであっても、レジスタにゼロをロードしてテストしません。

于 2013-05-26T06:48:12.760 に答える