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

如果您的编译器可以处理 C++11 初始化程序,那么您可以在构造函数初始化程序列表中设置数组值:

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

然后编译器将生成(非常优化的)代码来处理它。

于 2012-07-30T17:52:14.950 回答
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 回答