看起来是一个新手问题,但这个功能被多次调用,说实话,每秒数千次,所以优化是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 ) );
或其他方法。
答案 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
或其他什么?