У меня есть большое количество статических константных объектов, которые создаются с помощью конструктора 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();
}
Кроме того, вот CompilerExplorer для сравнения с виртуальным деструктором и без него: https://godbolt.org/z/M5G7LO