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 バイトあると考える理由はありません。これをわかりやすい名前の enum または 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;
}

また、これが他の誰かのために取り組んでいるプロジェクトでない場合は、そのようなアプリとシステム表記を混在させるのはやめてください。Apps 記法では変数の前に、メンバーの前に「m_」を付けたり、増加する変数の場合は「countInput」を付けたりするなど、変数の役割/目的/種類を説明する情報を変数の前に付けます。変数、例えば「lpszPtr」。最新の IDE では、多かれ少なかれシステム表記が冗長になり、間違いなく、テンプレートとオーバーロードを伴う言語で、潜在的に危険です。

于 2013-06-30T17:52:00.530 に答える
0

memcpy は、メモリ ブロックをある場所から別の場所にコピーする最速の方法だと思います。これは、コンパイラとオペレーティング システムによって最適化される必要があります。

割り当てられた宛先メモリを宣言する方法については、 memcpy 関数にとっては重要ではありません。これは、常にバイトのチャンクのみを想定しているためです。コピー後のデータの読み取り方法にのみ影響します。

于 2013-06-30T16:04:10.607 に答える