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