为我的对象分配特定/显式内存位置

时间:2012-06-27 13:31:30

标签: c++ pointers memory-address

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

4 个答案:

答案 0 :(得分:10)

您可以使用展示位置new运算符指定内存。

  

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

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

为了使其按预期工作,您可以动态分配内存,或者更好的是,使用std::vector并使用迭代器。 (这就是它们的用途)

答案 1 :(得分:-1)

C ++ placement 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();

答案 2 :(得分:-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();

这称为placement new

很丑,我不会这样做。如果它不是真正的内存/运行时关键,你可以考虑使用索引作为键的STL映射。作为一个积极的副作用,您可以免费跟踪已使用/未使用的ID。

使用预分配的矢量也可能有所帮助。检查Luchian的答案和评论。

答案 3 :(得分:-1)

关于你的ids的问题,这些也是连续的,没有遗漏值吗?

如果是的话

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

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