Я пишу некоторые прошивки и мне нужно использовать C-код без использования раздела данных.Это довольно просто, если предположить, что мы держимся подальше от глобалов.Или я так думал.
Я написал нечто функционально похожее на следующий код:
void func()
{
int feature_set[][2] = {
{feature0, 1},
{feature1, 0},
{feature2, 0}
};
//Use 'feature_set' for some hardware init
}
В моем конкретном случае использования feature_set
относится к некоторым данным конфигурации, которые мне нужно использовать для инициализации.Поскольку я создавал этот набор данных в стеке, я ожидал, что он будет создан в стеке перед использованием.Я понимаю, что это создаст больше инструкций, но это компромисс, с которым я согласен в этой ситуации.
Однако, взглянув на разборку, я понял, что она фактически делает что-то вроде этого:
mov ecx, <size>
lea edi, <stack addr>
lea esi, <somewhere in .data>
rep movs
Совершенно очевидно, что компилятор попытался оптимизировать эту операцию, создав константную версиюструктура в .data
и просто копирование его в стек при необходимости.
Вопрос: есть ли способ предотвратить это?Есть ли способ сказать компилятору не использовать сегмент данных для этой операции?Изменение уровня оптимизации может сработать, но я делаю хочу усилия по оптимизации ... просто не специально с этим типом конструкции.