Перейти к содержанию
    

модификатор const. Как правильно использовать в Си

Пусть generic - общий. Что от это изменилось? Си он и в африке Си и теперь в нём есть часть (читай глава) затрагивающая ембед.

А на gcc я ссылаюсь от того что это чуть-ли не единственный (ну может быть clang ещё) доступный, открытый и ОЧЕНЬ распространнённый компилятор для огромного количества архитектур.

Люди, разрабатывающие его являются членами комитета, утверждающего и разрабатывающего стандарт Си. Чем не автортет? Не согласны - приведите свои доводы.

Не нравится как я излагаю - читайте прикреплённые мной ссылки на оригиналы статей. Ради этого я их и прилагаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пусть generic - общий. Что от это изменилось?

Изменилось то, что вы думает об одном, а горите другое.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Изменилось то, что вы думает об одном, а говорите другое.

Согласен. Бываю грешен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Демиург, вы переоцниваете значимость техникал репортов. Переводя на русский это законопроект, который отнюдь не обязательно станет законом. Собственно в итоге не включают в станадарт большинство техникал репортов. Даже тех которые заметно более полезные чем выше перечисленные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Время покажет. Факт есть факт - в gcc уже реализовано и мало помалу обкатывается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

мдя

задал простой вопрос

и как всегда разгорелся срач на ровном месте

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вставлю и я свои 5 коп.

Inventor, всегда можно посмотреть адрес конкретной переменной.

Или константы . Средства Си это отлично могут делать.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

....в сегодняшних компиляторах для этого нужно писать в заголовке перменнные с словом extern

 

слово global помогло бы этого избежать

 

По количеству нажатий global ничем не лучше extern.

Зачем плодить синонимы?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему глобальный конст во флеше, локальный в озу?

 

 

Локальная const переменная может инициализироваться в момент вызова функции и на стадии сборки неизвестна. Нечего класть во флеш. А вот static const и глобальная const переменная известны уже на стадии сборки.

 

PS: у меня однажды с одним коллегой драма случилась, он мне долго доказывал, что const ложится всегда исключительно в ro секцию (типа константа ЖЕ) и меняться в процессе исполнения не может (так как либо это флеш, либо область защищенная MMU). Если общение было в тот момент не по переписке, думаю и до мордобития дошло бы дело :smile3009:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про применение volatile const для read only регистров переферии уже упоминалось?

Кажется это довольно яркая демонстрация того, что const гарантирует в первую очередь ошибку компилятора при попытке что-то записать в такую переменную, а всё остальное это уже побочные эффекты, оптимизации и здравый смысл разработчиков компилятора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про применение volatile const для read only регистров переферии уже упоминалось?

Кажется это довольно яркая демонстрация того, что const гарантирует в первую очередь ошибку компилятора при попытке что-то записать в такую переменную, а всё остальное это уже побочные эффекты, оптимизации и здравый смысл разработчиков компилятора.

 

Я в свое время добавил вопрос о const в список вопросов для соискателей на собеседовании. Удивительно было то, что порой люди с опытом 5 лет и более, ничего кроме "const это константа неизменяемая" сказать не могут. А случай когда регистр периферии volatile const они обычно называют каким-то искусственным и притянутым за уши.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Локальная const переменная может инициализироваться в момент вызова функции и на стадии сборки неизвестна. Нечего класть во флеш. А вот static const и глобальная const переменная известны уже на стадии сборки.
Локальная const переменная на стадии сборки известна.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

int f(int a )
{
const int c = 5;
return a + c;
}

Локальная const переменная на стадии сборки известна.

Сделали такой вывод потому, что можете видеть = 5 своими глазами? ;)

 

Выразимся точнее

Переменная c при любой настройке компилятора не ляжет во флеш потому, что у нее не static storage duration.

Переменная c вообще не займет никакой памяти(даже на стеке) при включении оптимизации.

Ознакомьтесь с

https://en.wikipedia.org/wiki/Constant_folding

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Переменная c вообще не займет никакой памяти(даже на стеке)
Как раз таки переменная c займет память программ.

 

int f(int a )

{//при входе а копируем в аккумулятор

const int c = 5;//этой строки в коде вообще может не быть.

return a + c;//здесь будет выполнен может быть выполнен код типа такого add acc,#5, где #5 - это и есть наша const int c, и эта пятерка лежит во флешь.

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну так мы же про размещение данных говорим вроде как.

return a + c;//здесь будет выполнен может быть выполнен код типа такого add acc,#5, где #5 - это и есть наша const int c, и эта пятерка лежит во флешь.
Кстати говоря эта пятерка уже не переменная. Она станет частью инструкции в общем случае называемой Add Immediate. Т.е. не пятерка займет флеш, а инструкция у котой нужные биты будут равны пятерке.

Так что не будем путать тёплое с мягким. Во флеше пятерки нет - есть инструкция, куда она входит.

 

А если в вышеуказанном примере сделать const int с = 1 то вообще интересно может получится - вместо этого будет сгенерирована какая-нибудь инструкция

inc acc

которая инкрементирует аккумулятор.

Тоже скажете, что константа во флеше?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...