0

メモリ アドレスを明示的に指定して、C++ でオブジェクトを作成できますか? これは、エンティティ (オブジェクト) ごとに個別の ID を持っているためです。したがって、これができれば、ポインタを追加するだけですべてのオブジェクトをトラバースできるようになります。考えてみてください: メモリ位置 x のオブジェクトがあります。メモリ位置 x+(次のオブジェクトの一意の ID)*K で次のオブジェクトを作成したい ここで、K は 2 つのオブジェクト間の一定のギャップです (たとえば)。

4

4 に答える 4

10

new配置演算子を使用してメモリを指定できます。

したがって、これができれば、ポインタを追加するだけですべてのオブジェクトをトラバースできるようになります。

あまり。これを行うように指示する回答は無視してください。配列の外でポインタ演算を行うことはできません。2 つのオブジェクトo1とがありo2、一方が に0x4あり、もう一方が にあるからといって、それがをもたらす0x5とは限りません。実際、これは未定義の動作です。&o1 + 1&o2

これが期待どおりに機能するためには、メモリを動的に割り当てるか、std::vectorイテレータを使用することをお勧めします。(それが彼らの目的です)

于 2012-06-27T13:32:53.607 に答える
-1

C++ 配置 new 演算子は、あなたが望むことを行います。それらに十分なメモリを割り当てるようにしてください。

参照: http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10

上記のリンクの例:

char memory[sizeof(Fred)];
void* place = memory;

Fred* f = new(place) Fred();
于 2012-06-27T13:36:02.987 に答える
-1

アンドリューの回答を使用して、オブジェクトの配列を割り当てることができます。

C++ では、new 演算子の特別な形式を使用して、事前に割り当てられたアドレスにオブジェクトを作成することもできます。

char memory[sizeof(MyClass[100])]; // memory for an array of 100 MyClass-objects

// Cast to MyClass-Array to let the compiler calculate
// the start addresses of the array elements.
MyClass * array = reinterpret_cast<MyClass *>(memory);

// create object with index 5
MyClass * pointerToSixthEntry= new (&array[5]) MyClass();

// Use the object by its index (no pointer arithmetic needed)
array[5].sayHelloWorld();

これを新しい配置と呼びます。

それは醜いです、そして私はそれをしません。メモリ/ランタイムがそれほど重要でない場合は、インデックスをキーとして STL マップを使用することを検討できます。プラスの副作用として、使用/未使用の ID を無料で追跡できます。

事前に割り当てられたベクトルを使用することも役立つ場合があります。Luchian の回答とコメントを確認してください。

于 2012-06-27T13:38:37.030 に答える
-1

あなたの ID についての質問ですが、これらも連続しており、欠損値はありませんか?

もしそうなら

std::map はニーズに合っていると思います。キー (ID) はソートされており (再帰内に挿入するだけです)、反復子 (ポインター演算) を使用できます。

http://www.cplusplus.com/reference/stl/map/

于 2012-06-27T14:24:54.017 に答える