0

我可以在 C++ 中创建一个对象,明确指定它的内存地址吗?这是因为我的每个实体(对象)都有单独的 ID。因此,如果我能做到这一点,我将能够仅通过添加指针来遍历我的所有对象。考虑:我有一个内存位置为 x 的对象。我想创建具有内存位置 x+(下一个对象的唯一 ID)*K 的下一个对象,其中 K 是两个对象之间的恒定间隙(例如)

4

4 回答 4

10

您可以使用放置new运算符指定内存。

因此,如果我能做到这一点,我将能够仅通过添加指针来遍历我的所有对象。

并不真地。忽略告诉您这样做的答案!您不能在数组之外进行指针运算。仅仅因为你有 2 个对象o1o2一个位于,另一个位于0x40x5并不意味着它&o1 + 1会产生&o2。事实上,这是未定义的行为。

为此,您可以动态分配内存,或者更好的是,使用 astd::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

Qestion 你的 id,这些也是连续的并且没有缺失值吗?

如果是这样的话

我认为 std::map 适合您的需求,键(您的 id)已排序,(只需在递归中插入)并且您可以使用迭代器(指针算术)。

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

于 2012-06-27T14:24:54.017 回答