更好的初始化数组的方法

时间:2012-07-30 17:47:47

标签: c++ arrays

看起来是一个新手问题,但这个功能被多次调用,说实话,每秒数千次,所以优化是CRUCIAL在这里。什么是最好的方法?

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;
        }
    }
};

memset s?

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

或其他方法。

3 个答案:

答案 0 :(得分:4)

只要你对零初始化感兴趣,你就可以做到

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

(不需要C ++ 11)。

但是,您可能需要查看编译器为其生成的代码。如果它不是以某种方式最优,那么更好的想法可能是保持结构为POD(无构造函数)并在声明该类型的对象时从外部初始化它

CHOLDELEM c = {};

答案 1 :(得分:1)

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

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

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

答案 2 :(得分: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或其他什么?