如何为多个堆重载新操作符?

Jac*_*ngs 9 c++ operator-overloading

在具有两个独立RAM存储区的嵌入式系统中,我有两个不同的堆(一个是来自较低内存区域的FreeRTOS的自定义实现,另一个是GCC在高端内存区域中生成的堆),我希望能够选择新使用的堆.

Mil*_*nek 13

你可以提供一个operator new接受第二个参数的重载,告诉它从哪个内存区分配内存.您可以operator new通过在new-expression中的类型之前将它们放在括号中来提供参数.这通常用于将new对象分配到已经分配的存储中(因为这是标准库提供的重载),但是任何东西都可以在那里传递并传递给它operator new.

enum MemoryArea {
    LOWER,
    UPPER
};

void* operator new(std::size_t sz, MemoryArea seg) {
    if (seg == LOWER) {
        return allocateMemoryInLowerMemoryArea(sz);
    } else {
        return allocateMemoryInUpperMemoryArea(sz);
    }
}

void operator delete(void* p) {
    if (pointerIsInLowerMemoryArea(p)) {
        freeMemoryFromLowerMemoryArea(p);
    } else {
        freeMemoryFromUpperMemoryArea(p);
    }
}

int main() {
    Foo* p = new (LOWER) Foo;
    Foo* b = new (UPPER) Foo;
    delete p;
    delete b;
}
Run Code Online (Sandbox Code Playgroud)

  • _"这是相同的语法"_但不是相同的语义更重要. (2认同)
  • 看起来标准实际上将其称为_placement new-expression_,而不管`operator new`重载实际上对参数做了什么.见§[expr.new]/13. (2认同)
  • 该标准将_placement new-expression_定义为为其提供_new-placement_子句的任何_new-expression_._new-placment_子句是_new-expression_中类型名称之前的括号表达式列表.这可能仍然是真的,这不应该被俗称为放置新的,但它在技术上是正确的. (2认同)