Глобальному массиву не присваивается то место которое он занимал бы в памяти

У меня есть такой скетч:

const uint32_t len = 65536;
uint8_t arr[len];

void setup() {}

void loop() {}

Длина массива должна вписываться в динамическую память. Однако, когда я компилирую скетч, он говорит это в окне вывода:

Sketch uses 10528 bytes (0%) of program storage space. Maximum is 2031616 bytes.
Global variables use 13504 bytes (1%) of dynamic memory, leaving 1034224 bytes for local variables. Maximum is 1048576 bytes.

Если я изменю len на 10, это не изменится. Компилятор настроен на "Отладку", поэтому он не должен быть оптимизирован. Это указывает на то, что память на самом деле не выделяется. В чем, по - видимому, здесь проблема?

Я компилирую для Teensy 4.0, но выход такой же по сути для Arduino Uno и других плат (с меньшим объемом памяти).

, 👍0

Обсуждение

Как вы его составляете? Если вы на самом деле не используете массив, он может быть просто оптимизирован., @Dave Newton

Я предполагаю, что это связано с тем, что в нем нет никаких данных., @Python Schlange


1 ответ


Лучший ответ:

4

Здесь нет никаких проблем. Только компилятор немного умнее, чем вы ожидали. Он видит, что вы нигде не используете arr, поэтому он просто оптимизирует его.

Есть два способа предотвратить это, если вы действительно хотите:

  • Я думаю, что вы можете использовать флаги, чтобы сказать компилятору, что это не должно быть оптимизировано. Я не эксперт в этом, другие могут знать больше об этом и добавить свой собственный ответ
  • Вы можете просто начать использовать его.
,

Это хороший момент, однако я уже думал об этом. См. Обновленный вопрос., @LukasFun

Неважно, по-видимому, эта настройка все равно приводит к тому, что компилятор ее оптимизирует. Как только появляется строка, которая записывает данные в массив, отображается правильное использование памяти для глобальных переменных., @LukasFun

Единственное, что остается после этого, - это то, что malloc (), похоже, не работает таким образом., @LukasFun

@LukasFun Правильно - "malloc" делает именно то, что должен, выделяет память в момент ее вызова. Используется ли эта память или нет, не имеет значения., @Dave Newton