В классе я хочу иметь постоянный массив константных строк C:
.cpp
const char* const Colors::Names[] = {
"red",
"green"
};
.h
class Colors {
public:
static const char* const Names[];
};
Массив должен быть общим длявсе экземпляры класса Colors (хотя я планирую иметь только один экземпляр, но он не должен быть метром), следовательно, объявляя массив статическим.
Требуется, чтобы, если класс не был создан, массив не должен занимать память вдвоичный файл.Однако, с вышеупомянутым решением, он потребляет:
.rodata._ZN6Colors5NamesE
0x00000000 0x8
не уверен в самих строках C, поскольку не может найти их в файле карты, но я предполагаю, что они также потребляют память.
Я знаюодним из решений этой проблемы было бы использование constexpr и C ++ 17, где больше не нужно иметь определение статических членов constexpr вне класса.Однако, по некоторым причинам (например, более высокие времена компиляции в моей системе сборки и немного большее использование памяти программы) я не хочу менять стандартную версию c ++.
Другая идея состоит в том, чтобы отказаться от статического (как я планирую иметьодин экземпляр в любом случае).Тем не менее, первая проблема с этим решением заключается в том, что я должен указать размер массива, который я предпочел бы не делать, в противном случае я получаю:
error: flexible array member 'Colors::Names' in an otherwise empty 'class Colors'
Вторая проблема заключается в том, что массив помещается в раздел ОЗУ (внутри объекта класса), и во флэш-память помещаются только строки C.
Кто-нибудь знает другие решения этой проблемы?
PS.Моя платформа - Stm32 MCU и использует компилятор GCC ARM
EDIT (чтобы ответить на некоторые ответы в комментариях). Как предлагается в комментариях, этого нельзя сделать только с помощью статических членов.Таким образом, вопрос, вероятно, должен быть следующим: Как создать (нестатический) член массива классов, который помещается в постоянную память (не инициализируется), которая помещается в память, только если класс фактически используется в программеи желательно общий для всех экземпляров этого класса?Сам массив используется только из этого класса.
Некоторая справочная информация: допустим, что массив имеет размер 256, а каждая строка C содержит 40 символов.Это 1 КБ для массива + 10 КБ для строк C (32-разрядная архитектура).Класс является частью библиотеки, которая используется различными проектами (программами).Если класс не используется в этом проекте, то я не хочу, чтобы он (и его массив) занимал хотя бы один байт, потому что мне нужно это FLASH-пространство для других вещей, поэтому сжатие не вариант.
Если не будет других решений, я рассмотрю возможность удаления неиспользуемых разделов с помощью компоновщика (хотя надеялся на более простое решение).Спасибо за все предложения.