这是我的情况:我想重载“operator new”,以便与其将我的对象分配到内存中的随机空间中,而不是将其分配到预定义的内存缓冲区中。我希望能够将此缓冲区保存到文件中并在将来加载,因此我想使用句柄而不是指针。理想情况下,我想要的是“new运算符”返回一个句柄,我可以使用该句柄直接进入对象在缓冲区中的位置。是否可以在C++(11)中做到这一点?如果没有,我最好的选择是什么?

最佳答案

Afaik,您不能更改new运算符的返回类型。对于您的方案,您可以尝试以下方法:

  • 定义一个Handle(或Handle<T>,如果您需要多个类型的句柄)类,该类在内部将索引存储到您的分配区域中(即Handle具有一个单个成员变量index)。 Handle类将需要在内部以某种方式访问​​您的分配子系统,即它将需要知道实际存储区(缓冲区)的位置。
  • Handle定义一个构造函数,以指针(由new实现返回)作为参数并从中计算索引(例如,减去存储区域的开头)
  • 还为operator *类定义一个解引用运算符(Handle),以返回对“已处理”对象的引用(例如,通过将索引添加到存储区的开头...)
  • 在您的代码中,始终至少在实际存储Handle / pointer的每个点上都使用Handle<T>而不是T的指针。

  • 这样,当您对存储区域进行序列化/反序列化时,仅索引将被写入磁盘。使用Handle类将与使用指针相同。实际指针的计算将在内部完成。

    当然,这会带来一些性能损失,因为总会进行一些计算,而不是直接使用指针。同样,这可能会影响编译器可以完成的优化。最小化此性能问题的一个想法是实现从Handle<T>T*的转换运算符,因此对于大量使用单个Handle / Pointer的代码段,您可以轻松地“预先计算”指针并在整个代码中使用它。

    关于c++ - 我可以使用其他返回类型重载 'operator new'吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25357206/

    10-12 18:05
    查看更多