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

标签 c++ operator-overloading new-operator

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

最佳答案

Afaik 你不能改变 new 的返回类型运算符(operator)。对于您的场景,您可以尝试以下方法:

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

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

  3. 同时为 operator * 定义一个解引用运算符 ( Handle )返回对“已处理”对象的引用的类(例如,通过将索引添加到存储区域的开头...)

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

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

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

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

相关文章:

c++ - std::cout 会影响计时器吗?

c++ - 我应该如何在恒定长度的 STL 样式数据结构中实现 max_size?

c++ - 这个 C++ 语法是什么意思,为什么会起作用?

Java通过循环创建对象

.net - Int32^ i = gcnew Int32() 是否分配在托管堆上?

c++ - 在哪里定义模板类的静态常量成员变量

C++ cuda opengl 不渲染 vbo

c++ - 具有重载 << 运算符的简单模板类失败, "Invalid use of template-id"

c++ - 对模板函数参数的延迟评估

php - `new` 和 `use` 关键字路径