3

既存の1Dアレイがありますがmemset、それをゼロにする最速の方法はありますか?

4

2 に答える 2

4

最速...おそらくそうです。バギーほぼ確実!

それは主に実装、プラットフォーム、および...配列に含まれる型に依存します。

C++ では、変数が定義されると、そのコンストラクターが呼び出されます。配列が定義されると、配列のすべての要素のコンストラクターが呼び出されます。

メモリを一掃することは、配列型がすべてゼロで表すことができる初期状態を持っていることがわかっていて、デフォルトのコンストラクターが何のアクションも実行しない場合にのみ、「良い」と見なすことができます。

これは一般に、組み込み型には当てはまりますが、他の型には当てはまりません。

最も安全な方法は、デフォルトで初期化された一時要素を要素に割り当てることです。

template<class T, size_t N>
void reset(T* v)
{
    for(size_t i=0; i<N; ++i) 
        v[i] = T();
}

T がcharの場合、関数は とまったく同じようにインスタンス化および変換されることに注意してくださいmemset。つまり、速度は同じで、それ以上でもそれ以下でもありません。

于 2012-01-03T19:52:27.270 に答える
3

これは実装固有であるため、知ることはできません。ただし、ライブラリの実装者が非常に高速になるように最適化するのに多くの時間を費やしているため、一般的には最速になります。また、コンパイラは、その意味memset知っているため、手動の実装では実行できない最適化を実行できる場合があります。 .memset

于 2012-01-03T19:36:40.883 に答える