这是我的情况:我想重载“operator new”,以便与其将我的对象分配到内存中的随机空间中,而不是将其分配到预定义的内存缓冲区中。我希望能够将此缓冲区保存到文件中并在将来加载,因此我想使用句柄而不是指针。理想情况下,我想要的是“new运算符”返回一个句柄,我可以使用该句柄直接进入对象在缓冲区中的位置。是否可以在C++(11)中做到这一点?如果没有,我最好的选择是什么?
最佳答案
Afaik,您不能更改new
运算符的返回类型。对于您的方案,您可以尝试以下方法:
Handle
(或Handle<T>
,如果您需要多个类型的句柄)类,该类在内部将索引存储到您的分配区域中(即Handle
具有一个单个成员变量index
)。 Handle
类将需要在内部以某种方式访问您的分配子系统,即它将需要知道实际存储区(缓冲区)的位置。 Handle
定义一个构造函数,以指针(由new
实现返回)作为参数并从中计算索引(例如,减去存储区域的开头)operator *
类定义一个解引用运算符(Handle
),以返回对“已处理”对象的引用(例如,通过将索引添加到存储区的开头...)Handle<T>
而不是T
的指针。 这样,当您对存储区域进行序列化/反序列化时,仅索引将被写入磁盘。使用
Handle
类将与使用指针相同。实际指针的计算将在内部完成。当然,这会带来一些性能损失,因为总会进行一些计算,而不是直接使用指针。同样,这可能会影响编译器可以完成的优化。最小化此性能问题的一个想法是实现从
Handle<T>
到T*
的转换运算符,因此对于大量使用单个Handle / Pointer的代码段,您可以轻松地“预先计算”指针并在整个代码中使用它。关于c++ - 我可以使用其他返回类型重载 'operator new'吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25357206/