1

ポインタに関するいくつかの質問があります。

class object
{
private:
    vector<point> points_;
}

上記のようにクラスを書いているとしましょう。ポイントがたくさんあり、配列が長い場合、何を提案しますか?または使用する必要がありますvector<point> points_vector<point>* points_

C ++コードではポインターをより効率的に使用できるので、可能な限り使用する必要がありますか?注:最終的なプログラムはできるだけ速くする必要があります。

経験豊富なプログラマーは常にポインターを使用するのが好きですか?効率が問題ではない場合、または私にとって問題ではない場合、ポインターを使用しない方が明確であり、ポインターを使用することには常に多くの生涯の問題があることがわかりました。ありがとう

4

4 に答える 4

5

ここでポインタを使用する理由はありません。ベクトルオブジェクトは、ベクトル内の要素の数に関係なく、同じ(小さい)サイズになります。

ベクトルには、データが格納されているスペースを参照するポインターが既に含まれています。そのスペースは動的に割り当てられます(変更する手順を実行しない場合は、フリーストアから)。

于 2013-01-09T06:28:42.497 に答える
3

ベクトルは動的配列です。sizeofは、サイズに関係なく一定です。とにかくポインタを使う必要はありません。

于 2013-01-09T06:27:47.997 に答える
2

問題は、実際には、コンテナーへのポインターではなく、正しいSTLコンテナーを選択することです。本からの単語の下の引用Effective STL

vector、list、およびdequeは、プログラマーにさまざまな複雑さのトレードオフを提供し、それに応じて使用する必要があります。vectorはデフォルトで使用されるシーケンスのタイプであり、シーケンスの途中から頻繁に挿入および削除される場合はlistを使用する必要があります。 、dequeは、ほとんどの挿入と削除がシーケンスの最初または最後に行われる場合に選択されるデータ構造です。

Does an experienced programmer always love to use pointers?

new/deleteスマートポインタは非常に便利です。実際には、生のポインタを操作する代わりに、ほとんどの場合スマートポインタを使用します。

于 2013-01-09T06:38:29.733 に答える
1

速度が重要な場合に将来の問題を解決するために、ルックアップ時間だけでなく、キャッシュミスの観点からメモリ管理について考えてください。上記の答えは私が同意します。クラスがページファイルのサイズよりも大きくない限り、ポインタは必要ありません。その場合、クラスを50回または100回分解することを検討し、それでもポインターを使用しないことをお勧めします。

速度を考えるとき、たとえばゲームエンジンでは、できるだけ多くのメモリをまとめ、必要になる前にロードし、不要なときにアンロードするようにします。メモリがフラッグされたり、キャッシュペナルティでより多くのヒットが発生したりしないようにする必要があります。特定のフレームレート、たとえば30 fpsを維持しようとする場合、実際にはこれをあまり変化させたくありません(これは、多くのキャッシュミスやメモリ移動で発生します)。std :: vectorを使用すると、誰かが提案したようにこれを行うことができ、事前に割り当て、十分に割り当てるか、必要以上に割り当てることができます。サイズ変更は後でゲームの実行時に苦痛になります。 -いいえ。

とにかく、キャッシュミスをしないことを意味する場合は、必要なものを見つけるためにすべてをトラバースする必要がある場合でも、オブジェクトの大きな配列/ベクトルを使用する方が効率的な場合があります。メモリがロードされている場合、順次保存されると、オブジェクトからオブジェクトへのジャンプが非常に高速になります。さらに、たとえば(int)idを持つものでは、vectorObject.at(id_location)を実行するのは一定時間であり、キャッシュの問題がなければ非常に高速です。

一方、たとえば、多くのキャッシュミス(データベースサイズなど)を生成する可能性のある非常に大きなベクトルへのポインタを含むstd::mapをロードした方がよい場合があります。マップのトラバースは、ベクトル(n)時間のトラバースと比較して、lg(n)時間であり、1つのキャッシュミスであっても、ポインターを介してレコード位置にジャンプする方が効率的です。ハードディスク全体をトラバースするよりも優れており、ティアジャークキャッシュを生成します。

もちろん、これは永遠の問題であり、必要なものに応じて何が正しいかを決定します。キャッシュミスを回避することを知っていると、より良い決定を下すのに役立ちます。これは、キャッシュミスについて考える必要があるのはこれが最後ではないことを確信できるからです。

于 2013-01-09T12:33:39.663 に答える