Статические члены класса, влияющие на объем памяти программы, даже если класс не используется - PullRequest
0 голосов
/ 07 февраля 2019

В классе я хочу иметь постоянный массив константных строк 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-пространство для других вещей, поэтому сжатие не вариант.

Если не будет других решений, я рассмотрю возможность удаления неиспользуемых разделов с помощью компоновщика (хотя надеялся на более простое решение).Спасибо за все предложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...