0

初心者の質問に見えますが、この関数は何度も呼び出されます。正直なところ、毎秒何千回も呼び出されるため、ここでは最適化が非常に重要です。最良の方法は何ですか?

struct CHOLDELEM
{
    DWORD dwColor[3], dwItemId[3];
    int nPos[3], nLength[3];
    CItemElem* pItem[3];
    CHOLDELEM()
    {
        for( int i=0; i<=3; i++ )
        {
            dwColor[i] = dwItemId[i] = 0;
            nPos[i] = nLength[i] = 0;
            pItem[i] = NULL;
        }
    }
};

またはmemsetsと?

memset( dwColor, 0, sizeof( dwColor ) );

または別の方法。

4

3 に答える 3

4

ゼロ初期化のみに関心がある限り、簡単に行うことができます

CHOLDELEM() : dwColor(), dwItemId(), nPos(), nLength(), pItem()
  {}

(C++11 は必要ありません)。

ただし、コンパイラが生成するコードを確認することをお勧めします。どういうわけか最適でない場合は、構造体を POD (コンストラクターなし) に保ち、その型のオブジェクトを宣言するときに「外部から」初期化することをお勧めします。

CHOLDELEM c = {};
于 2012-07-30T17:55:02.070 に答える
1

私はおそらくこのmemsetアプローチを使用しますが、より複雑なデータメンバーが追加されたときにそれが壊れないことを確実に確認したいと思いますCHOLDELEM

#include <type_traits>

// ...

    CHOLDELEM()
    {
        static_assert(std::is_trivially_copyable<CHOLDELEM>::value,
                      "It is no longer safe to use memset!");
        memset(this, 0, sizeof *this);
    }

ちなみに、CHOLDELEMひどい名前です。名前を変えてみませんElementHolderか?

于 2012-07-30T18:04:34.340 に答える
1

コンパイラが C++11 初期化子を処理できる場合は、コンストラクター初期化子リストで配列値を設定できます。

CHOLDELEM() :
    dwColor{0}, dwItemId{0}, nPos{0}, nLength{0}, pItem{nullptr}
    { }

次に、コンパイラはそれを処理するための (かなり最適な) コードを生成します。

于 2012-07-30T17:52:14.950 に答える