С++ массив указателей на массив на ограниченной платформе памяти (arduino)

для каждой буквы в алфавите у меня есть int-массив, объявленный следующим образом:

int const  A[64] ={ 
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,1,1,1,0,0,0,0,
    0,1,0,1,0,0,0,0,
    0,1,1,1,0,0,0,0,
    0,1,0,1,0,0,0,0,
    0,1,0,1,0,0,0,0,
    0,0,0,0,0,0,0,0
};

тогда я создаю другой массив с указателями на них.

int const * text[] = { A, B, C };

это отлично работает, пока этот текстовый массив не достигнет определенного количества разных записей.

например, это работает:

int const * text[] = { A, A, A, A, A, A, A, A }; // could even go on much longer

но это сбой:

int const * text[] = { A, B, C, D }; // it seems the number of different entries matters

почему? я думал, что если это указатели, то не имеет значения, что он указывает на него, всегда будет иметь постоянный размер?

Обратите внимание, что это выполняется на платформе arduino, которая имеет очень ограниченную память.

Ответ 1

Я подозреваю, что поиск в массиве с одинаковыми элементами оптимизируется; Если int const *text[]; были объявлены в файле заголовка и скомпилированы (определены) в отдельном объектном файле, вы, вероятно, увидите ту же проблему. Компилятор делает все возможное, но все эти данные, вероятно, перекрываются с пространством кучи/стека.

По крайней мере, с avr-libc (с использованием avr-gcc, avr-binutils) есть макросы или переменные атрибуты, которые могут помещать этот тип постоянных данных в гораздо большем программном пространстве только для чтения (флэш-ROM).