Цитата(singlskv @ Sep 21 2007, 22:08)

Если я чего не понял, то речь о том что Gcc в стартапе копирует все константные переменные
в RAM из Flash, делает он это только с одной целью, ускорить обращение к этим константам.
Просто автар написав const перед константной переменной, видимо решил что эта константа
будет хранится в флеш...
В Gcc для того что бы константы не перегружалась из флеш в RAM об этом нужно явно указать.
"ах, так вы об этом..."
const указывает только на запрет изменения переменной из программы, а не на то, что она
должна быть размещена во флеше. Стандарт есть стандарт и все вне-стандартные вещи (стандарт ничего не знает о флеше) нужно явно указывать.
Надеяться на то, что const автоматически поместит переменную во флеш можно только на неймановской архитектуре (единое адресное пространство) - компилятор
может "соптимизировать" константную переменную и разместить её во флеше ("раз её всё равно не будут менять - пусть лежит там, где это невозможно и не занимает память дважды").
Если это происходит на гарварде без дополнительных компиляторо-зависимых слов
code /
__flash /
__attribute__((__progmem__)), то компилятор не прав.
И дело тут вовсе не в "ускорении доступа" как таковом, а в том, что указатель на тип
T должен без проблем передаваться как указатель на
const T и присваиваться соответствующим указательным переменным.
Например, имеем функцию с таким прототипом (функции стандартной библиотеки имеют стандартизованные прототипы).
char *strcpy(char *s1, const char *s2);Указатель s2 квалифицирован как указатель на константный объект, функция его не изменяет. Но в качестве s2 должно быть можно передавать и указатель на неконстантный объект - как следствие, char[] и const char[] должны лежать в одном пространстве памяти.
Хотя, конечно, вопрос можно свести к "быстродействию" - если все указатели в программе для гарвардской архитектуры сделать универсальными, несущими в себе признак адресного пространства (3-байтовыми для AVR), то ничего никуда не надо будет копировать, всё будет практически работать одинаково медленно

. Но если указатели на данные имеют "родной" размер, то компилятор обязан const размещать там же, где и не-const.