C++ 类中 unsigned char 的优化访问

标签 c++ optimization

我有一个 C++ 类

class clsByteContainer 
{
private:

protected:

public:
    vector<unsigned char>Content;
};

我用无符号字符填充内容。

m_ByteContainer.Content.resize(iByteCount);
memcpy(&m_ByteContainer.Content[0], &((unsigned char*)(m_pVoiceData))[iStartPos],iByteCount);

我这样访问它:

double dblRes = 0;
for (int i = 0; i < 50; i++)
{
    unsigned char val1=m_ByteContainer.Content[iStartPos+i];
    unsigned char val2=uTargetFeatureVector_Bytes.Values[i];
    if (val1 != val2)
    {
        dblRes +=1;
    }
}

我的问题是:

我能否加快/优化我在类中存储无符号字符的方式?

我不确定这个声明是否正确

public:
    vector<unsigned char>Content;
};

非常好,或者是否可以优化。

如果能就此获得帮助或意见,那就太好了。

速度对我来说最重要。

非常感谢!

最佳答案

正如已经指出的那样,您不应该尝试手动优化它,除非您已经将它作为速度问题隔离开来。从您提交的代码来看,您似乎有更大的外围问题。

当您填充数组时,看起来您首先是从无符号字符的数组或 vector 中这样做的。

m_ByteContainer.Content.resize(iByteCount);
memcpy(&m_ByteContainer.Content[0], &((unsigned char*)(m_pVoiceData))[iStartPos],iByteCount);

一般写的会好一些

typedef unsigned char uchar_t;


const uchar_t* voiceData = (uchar_t*)m_pVoiceData + iStartPos;
m_ByteContainer.assign(voiceData, voiceData + iByteCount);

让容器担心优化。

在下一段代码中,for 循环中有一个令人担忧的常量:

double dblRes = 0;
for (int i = 0; i < 50; i++)

从我们看到的代码来看,没有理由认为任何一个容器中都有 50 个字节。您应该将其设为具有描述性名称的枚举或 const 变量,或者您应该使用 m_ByteContainer 或 uTargetFeatureVector 之类的访问器。

// in the class:
const size_t MaxTargetFeatures = 50;


// in the code:
if (m_ByteContainer.empty() || m_byteContainer.size() < iStartPos)
    return ...;
const size_t containerBytes = std::min(m_byteContainer.size() - MaxTargetFeatures, iStartPos);
const size_t vectorBytes = std::min(uTargetFeatureVector_Bytes.size(), MaxTargetFeatures);
const size_t maxCompare = std::min(containerEnd, vectorEnd);

const uchar_t* const begin = &m_ByteContainer[iStartPos];
const uchar_t* const end = &m_ByteContainer[iStartPos + maxCompare];
const uchar_t* feat = &uTargetFeatureVector_Bytes.Values[i];
for (const uchar_t* p = begin; p != end; ++p, ++feat)
{
    if (*p != *feat)
        dblRes += 1;
}

此外,如果这不是您正在为其他人工作的项目,请停止混合使用应用程序和系统符号。应用程序符号为变量加上描述变量描述的角色/目的/事物种类的信息前缀,例如将“m_”放在成员前面或将“countInput”用于递增的变量,而系统则为变量的类型加上前缀变量,例如“lpszPtr”。现代 IDE 或多或少地使系统符号变得多余,并且可以说,在具有模板和重载的语言中,具有潜在的危险。

关于C++ 类中 unsigned char 的优化访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17392164/

相关文章:

algorithm - 大O,您如何计算/近似?

c++ - 仅适用一次的宏

c++ - 延迟函数调用中的延迟函数调用

c++ - 与 C++ 模板混淆

mysql - 如何优化双选查询

arrays - 规范化数组元素的算法

c++ - CUDA 6.0 链接错误 : undefined reference to `__cudaUnregisterFatBinary'

c++ - 您如何使用标准引号解释指向基类和派生类成员的指针的这种差异?

javascript - 优化参数有什么用?

optimization - JSF/Richfaces 迭代中的迭代范围变量?