2017-09-07 9 views
0

このクラスを考える:C++初期化子リストのstd ::配列最高のパフォーマンス

template<class value_type, std::size_t row_count, std::size_t column_count> 
class matrix 
{ 
public: 
    matrix() 
    { 
    } 

    matrix(std::array<std::array<value_type, row_count> ,column_count> matrix_data) 
     : data(matrix_data) {} 

    void 
    insert(std::size_t row, std::size_t column, value_type value) 
    { 
     data[row][column] = value; 
    } 

    value_type 
    get(std::size_t row, std::size_t column) const 
    { 
     return data[row][column]; 
    } 

private: 
    // Initialised to zero 
    std::array<std::array<value_type, row_count>, column_count> data{}; 
}; 

データ配列をゼロに初期化されます。しかし、2番目のコンストラクタ(デフォルト以外のもの)を使用すると、他の値で上書きされます。

最初のコンストラクタが使用されたときに値がゼロに初期化されるように、パフォーマンスを向上させる方法はありますか? forループを推測すると、文よりも効率が悪いですか? 私はそうですか?

おかげ

+5

なぜ、2番目のコンストラクタでゼ​​ロが配列を初期化すると思いますか? – NathanOliver

+2

ところで、 'value_type'のコピーを避けるために、const参照によって戻ります。 (セッターと同様に適用)。 – Jarod42

+0

私は、2番目のコンストラクタがstd :: arrayのコピーコンストラクタを使用すると考えましたか?私は、2番目のコンストラクタ0が配列を初期化すると仮定しませんでした。 –

答えて

2

あなたは

std::array<std::array<value_type, row_count>, column_count> data{}; 

のようなクラスのメンバを持っているとき、あなたは何を言っているかすべてのコンストラクタで初期化子としてdata使用data{}を初期化していないということです。 dataのメンバ初期化子を提供するコンストラクタがある場合、コンパイラは指定したデフォルトの代わりにその初期化子を使用します。それはdataコピーmatrix_dataから初期化され、全くのゼロ初期化ステップが存在しないことを

matrix(std::array<std::array<value_type, row_count> ,column_count> matrix_data) 
    : data(matrix_data) {} 

を意味します。

+0

ありがとう私の友人 –