2017-06-11 4 views
3

標準ライブラリクラステンプレートstd::array<T, N>すべてoperator[]オーバーロードがされている、両方のメンバアクセッサ関数C++ 17でstd :: arrayでstd :: getを使用するとパフォーマンスが向上しますか?

constexpr const T& operator[](size_type n) const; 

ならびに非メンバアクセッサ関数テンプレート

template< size_t I, class T, size_t N > 
constexpr const T& get(const array<T,N>& a) noexcept 

を有しますconstexprを作ったので、残っているものがあれば、それはstd::getというものが何であるか不思議です。例えば。このようなプログラムで:

int main() 
{ 
    auto a = std::array<int, 3> { 1, 2, 3 }; 
    constexpr auto idx = 0; 
    std::cout << a[idx] << '\n'; 
    std::cout << std::get<idx>(a) << '\n'; 
} 

まともなコンパイラがoperator[]getの両方のために一定の指標値0を伝播することができるはずです。

質問std::getstd::arrayoperator[]がないことを何恩恵を与えるのでしょうか?

+3

利点は、 'std :: array'が' std :: tuple'が期待される多くの場所で使用できることです。 – Justin

+2

パフォーマンスは賢明ではありませんAFAIK;あなたのコンパイラオプティマイザがその仕事をしていると仮定します。 –

答えて

10

Getは構造化バインディングに必要です。

他の汎用タプルコードでも使用されます。

+0

ああ、構造化バインディングは良い点です。しかし、 'get'は' op [] 'にコンパイル時定数を代入するだけなので、他の文脈ではパフォーマンスの違いはありませんよね? – TemplateRex

+2

@TemplateRex [godbolt](https://godbolt.org/g/GIVzYe)で遊んでください。 –

3

質問:どのようなメリットがstd::getstd::arrayoperator[]いないことを与えるのでしょうか?私たちは、暗黙的にC++で一般的に定義品種だか、明らかであるタプルとの共通のインターフェイスを、提供することに加えて

std::getは1つのより多くの利点を持っています。コンパイル時に境界チェック:

std::array<int, 3> arr; 
arr[4] = 17;   // bad 
std::get<5>(arr) = 42; // bad, but also compile error, so actually good 

インデックスが([array.tuple]を参照)範囲外ですが、operator[]はあなたが追跡する必要があるだけで、実行時の問題であれば、タプルインターフェースが明示的に病気に形成されているためです。

関連する問題