17

次のコードで、外部使用に最適な最適化を可能にする関数はどれですか?その理由は? 「バージョン 4」は C++ 2011 で許可されていますか?

template<unsigned int TDIM> class MyClass 
{
    public:
        static inline unsigned int size()           {return _size;} // Version 1
        static inline const unsigned int size()     {return _size;} // Version 2
        static constexpr unsigned int size()        {return _size;} // Version 3
        static inline constexpr unsigned int size() {return _size;} // Version 4
    protected:
        static const unsigned int _size = TDIM*3;
};

どうもありがとうございました。

4

2 に答える 2

22

のコードは<random>良い例だと思いますが、むやみに従う必要もありません。では<random>、次の両方のスタイルが表示されます。

template<unsigned int TDIM> class MyClass 
{
    public:
        static constexpr unsigned int size() {return _size;}  // 1
        static constexpr unsigned int dim = TDIM;             // 2
    private:
        static const unsigned int _size = TDIM*3;
};

1 と 2 の間の選択は、主に文体的なものです。コンパイル時の結果を要求する方法で使用される場合、これらは両方ともコンパイル時に解決されます。クライアントに入力してもらいたい()かどうか。いずれかのスタイルを使用する必要がある一般的なコードはありますか? ここでは、汎用コードの要件を満たすことが重要です。

キーワードの使用は、inlineここでは影響しません。冗長すぎると思いますが、使用しても害はなく、影響もありません。

戻り値の型に追加constしても、ここには影響しません。冗長すぎると思いますが、使用しても害はなく、影響もありません。

関数スタイルを使用するが、使用しない場合constexpr:

    static unsigned int size() {return _size;}

この関数はコンパイル時に呼び出すことができないため、コンパイル時の定数を期待するコンテキストでは使用できません。アプリケーションやクライアントがそのような機能を必要としない場合、それによって害が生じることはありません。しかし、ツールボックスを持っているならconstexpr、これはそれを使用するのに最適な場所です。そうすれば、将来のクライアントは次のようなことができます:

template <unsigned N> struct B {};
constexpr auto myclass = MyClass<3>();
// ...
// lots of code here
// ...
B<myclass.size()> b;

これら 2 つは同等です。

        static constexpr unsigned int dim = TDIM;        // 2
        static const unsigned int dim = TDIM;            // 3

ただし、関連する型が整数であるという理由だけです。型が整数でない場合は、使用する必要がconstexprあり、型にはconstexprコンストラクターが必要です。

class A
{
    unsigned _i;
public:
    constexpr A(unsigned i) : _i(i) {}
};

template<unsigned int TDIM> class MyClass 
{
    public:
        static constexpr unsigned int size() {return _size;}
        static constexpr unsigned int dim = TDIM;
        static constexpr A a = A(dim);
    private:
        static const unsigned int _size = TDIM*3;
};

私を含め、ここにいる全員が の使い方をまだ学んでいますconstexpr。したがって、質問に+1します。

于 2012-08-12T01:56:00.700 に答える
0

static const 整数値は、コンパイラによって変数ではなく定数として扱われます。定数によっては、メモリをまったく使用しない場合があります。すべての例で、関数は定数値を返し、ほぼ常にインライン化されます (上記のように、すべての宣言が既にインライン化されているため、この例では inline キーワードは必要ありません)。

上記のコードは、コンパイラの観点からは次のように変わりません。

static unsigned int size() { return 42; }

また、バージョン 2 の「const」キーワードは必要ありません。ポインターまたは参照を返す場合にのみ意味があると思います。

于 2012-08-12T01:52:59.287 に答える