我可以使用不同的返回类型重载'operator new'吗?

时间:2014-08-18 06:06:42

标签: c++ operator-overloading new-operator

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

2 个答案:

答案 0 :(得分:0)

我知道可以帮到你的东西..试试这个..

标准C ++还支持新的第二个版本,称为placement new,它在预分配的存储上构造一个对象。为了使其工作,我们必须提供我们希望将对象分配为指针参数的地址:

(my_class = new(place)Myclass);

那你为什么要使用贴身新品呢? Placement new对于在预先分配的内存块中构造对象很有用。这通过允许构造对象的人选择其初始化的存储器来绕过operator new的工作。如果你有一个内存池用于构造类的某些对象,但是不想为整个类重载operator new,那么你可能会这样做。

答案 1 :(得分:0)

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

  1. 定义Handle(或Handle<T>,如果您需要多个类型的句柄)类,它在内部将索引存储到您的分配区域(即Handle具有一个单一成员变量index)。 Handle类需要在内部以某种方式访问​​您的分配子系统,即它需要知道实际存储区域(缓冲区)的位置。

  2. Handle定义构造函数,将指针(由new实现返回)作为参数并从中计算索引(例如,通过减去存储区域的开头)

  3. 还为operator *类定义一个解除引用运算符(Handle),返回对&#34;处理&#34;的引用。对象(例如,通过将索引添加到存储区域的开头...)

  4. 在您的代码中,alsways使用Handle<T>而不是指向T的指针,至少在您实际存储句柄/指针的每个位置。

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

    当然这会有一些性能损失,因为不是直接使用指针,总会有一些计算。这也可能影响编译器可以完成的优化。最小化此性能问题的一个想法是实现从Handle<T>T*的转换运算符,因此对于使用单个句柄/指针的代码片段,您可以很容易地&#34;预计算&#34 ;指针并在整个代码中使用它。