我可以在C ++中创建一个明确指定其内存地址的对象吗?这是因为我为每个实体(对象)分别设置了id。因此,如果我能做到这一点,我将能够通过仅添加指针来遍历所有对象。 考虑: 我有一个内存位置x的对象。 我想创建具有内存位置x +(下一个对象的唯一ID)* K的下一个对象 其中K是两个物体之间的恒定间隙(比如说)
答案 0 :(得分:10)
您可以使用展示位置new
运算符指定内存。
所以,如果我能做到这一点,我将能够通过添加指针来遍历所有对象。
不是真的。 忽略答案,告诉你这样做!你不能在数组之外做指针算术。仅仅因为您有2个对象o1
和o2
,其中一个位于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)被排序,(只是在递归中插入) 并且你有能力使用迭代器(指针算术)。