0

我有一门 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;
};

真的很好,或者如果可以优化。

获得帮助或对此提出意见会非常好。

速度对我来说最重要。

非常感谢!

4

2 回答 2

1

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

当您填充数组时,看起来您首先是从无符号字符的数组或向量中执行此操作的。

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 或多或少地使系统符号变得多余,并且可以说,在具有模板和重载的语言中,存在潜在危险。

于 2013-06-30T17:52:00.530 回答
0

我相信 memcpy 是将内存块从一个位置复制到另一个位置的最快方法。这应该由编译器和操作系统进行优化。

至于声明目标分配内存的方式,它与 memcpy 函数无关,因为它总是假定它只是一个字节块。它只会影响您在复制数据后读取数据的方式。

于 2013-06-30T16:04:10.607 回答