0
for( int i = 0; i < lines; i++ ) {
    std::unique_ptr<BYTE[]> pLine( new BYTE[lineSize] );
    //Do stuff
}

ここで、pLine はループ本体でのみ使用されるため、ループ内で宣言されます。ただし、ループの外側で 1 回だけ割り当てを行うと、実行される割り当ての量が減るのではないでしょうか (メモリの断片化を回避します)。

std::unique_ptr<BYTE[]> pLine( new BYTE[lineSize] );
for( int i = 0; i < lines; i++ ) {
    //Do stuff
}

lineSize が反復全体で同じままであることがわかっていれば、コンパイラーは最初のバージョンを簡単に最適化できると思います。ただし、関数呼び出し全体で変化するため、定数にすることはできません。

また、パフォーマンスの問題が検出されるまで、このようなマイクロ最適化は避けるべきだと思うので、最初のバージョンを使い続けると思います。皆さんはどう思いますか?

4

3 に答える 3

3

まず第一に、そのために間違ったツールを使用していると思います。使用する必要があるのはstd::vector次のとおりです。

std::vector<BYTE>  data(count); //allocate and initialize

メモリを割り当て、すべての要素を初期化します。初期化せずに割り当てのみを行いたい場合は、次のように記述します。

std::vector<BYTE>  data;
data.reserve(count); //allocate only

では、どこに宣言すればよいのでしょうか。それは使い方次第です。ただし、変数のスコープを縮小するようにしてください。ループ内でのみ必要な場合は、forループ内で宣言してください。

于 2012-06-08T17:20:52.857 に答える
2

The question is really what is in the //do Stuff

for( int i = 0; i < lines; i++ ) {
    std::unique_ptr<BYTE[]> pLine( new BYTE[lineSize] );
    //Do stuff
}

I would assume you are allocating the memory inside the loop to unique_ptr because somewhere in the //Do stuff section you are passing ownership of that memory to another object.

This if you try and do this:

std::unique_ptr<BYTE[]> pLine( new BYTE[lineSize] );
for( int i = 0; i < lines; i++ ) {
    //Do stuff
}

The first time around the loop ownership is transfered and now pLine contains a NULL pointer for the second a subsequent iteration.

If you are not transfering ownership then you are probably using the completely wrong method for memory management and a vector is probably a better idea.

for( int i = 0; i < lines; i++ ) {
    std::vector<BYTE> pLine(lineSize);
    //Do stuff
}

The advantage of putting it inside the loop it is re-initialized so all members are zero on every iteration of the loop. If the //Do Stuff is affected by the state of the pLine then it may be incorrect to move it outside the loop (without also doing some more work to make sure the state of pLine is correct after each iteration.

于 2012-06-08T17:58:25.947 に答える
0

また、パフォーマンスの問題が検出されるまで、このようなマイクロ最適化は避けるべきだと思います

これは「マイクロ最適化」ではなく、常識です。たとえコンパイラが変数をループの外側に持ち上げることができたとしても (それができるかどうかを確認しましたか?)

マイクロ最適化は、明快さを犠牲にしてコードを高速化し、メモリ効率を高めます。これはその説明に当てはまりません。

無関係なメモとして、実際に へのポインタが必要ですBYTE[]か? 奇妙に思える...

于 2012-06-08T17:21:05.403 に答える