小编Rob*_* B.的帖子

虚拟析构函数将对象移出rodata部分

我有大量使用constexpr构造函数构造的静态常量对象,因此它们无需任何构造函数调用即可立即存储在最终二进制文件中。

由于我正在使用内存较低的系统(STM32 MCU),因此我想减少这些对象的内存占用,并且由于它们是恒定的,因此请将其存储在该.rodata部分中。编译器对此进行了顺利处理。

但是,既然我已在基类中添加了虚拟析构函数以删除编译器警告,则对象将存储在该.data部分中。

当然,我可以使用某些方法#pragma专门删除基类的编译器警告,并删除虚拟析构函数,但是我想知道是否有更干净的解决方案。

极简主义代码展示了这个问题:

class Object {
    int value;
public:
    constexpr Object(int param) 
    : value(param) {}

    virtual int getValue() const = 0;

    virtual ~Object() = default; // This line causes problems
};

class Derived : public Object {
    volatile int otherValue;
public:
    constexpr Derived(int param1, int param2) 
    : Object(param1), otherValue(param2) {}

    int getValue() const override { return otherValue; }
};


const Derived instance(1,2);

int main() {
    return instance.getValue();
}
Run Code Online (Sandbox Code Playgroud)

另外,这是一个CompilerExplorer,可以在有和没有虚拟析构函数的情况下进行比较:https : …

c++ gcc elf

12
推荐指数
1
解决办法
301
查看次数

标签 统计

c++ ×1

elf ×1

gcc ×1