|
WinAVR инициализирует все переменные!, Нельзя ли избавить его от этого глупого занятия? |
|
|
|
Apr 25 2008, 11:39
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(777777 @ Apr 25 2008, 15:27)  сабж, собсно... Это гупостью он занимаеться, для того чтобы соответствовать стандарту языка С. Анатолий.
|
|
|
|
|
Apr 25 2008, 13:16
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(777777 @ Apr 25 2008, 13:56)  Значит такое понятие как "неинициализированная переменная" уже не существует? Существует - для определенности она инициализируется нулем. Для инициализвции случайным числом существуют генераторы случайных чисел, однако. Цитата А если мне нужно инициализировать не нулем, а другим числом? Инициализируйте. Никто не запрещает. Цитата Несколько глупо, не так ли? Глупо, это то, что Вы тут пропагандируете. Цитата(MrYuran @ Apr 25 2008, 14:56)  вроде как перед объявлением переменной без инициализации надо писать _no_init или чё-то в этом духе Смотреть документацию на конкретный компилятор в части расширений языка. Для садомазохистов правится startup и убирается инициализация, вообще.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 25 2008, 13:43
|
Частый гость
 
Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118

|
Так ведь это уже обсуждалось пару дней назад.
The .noinit Section This sections is a part of the .bss section. What makes the .noinit section special is that variables which are defined as such:
int foo __attribute__ ((section (".noinit"))); will not be initialized to zero during startup as would normal .bss data.
Все, что не подлежит инициализации размещается а секции noinit. Подробности - в avr-libc/avr-libc-user-manual/mem_sections.html
--------------------
ASB
|
|
|
|
|
Apr 25 2008, 13:56
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(777777 @ Apr 25 2008, 15:56)  Да ну, давно ли? Может еще пунктик стандарта укажете, в котором это предписывается? JTC1/SC22/WG14 - Chttp://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdfЦитата WG14/N1124 Committee Draft — May 6, 2005 ISO/IEC 9899:TC2 ... 6.7.8 Initialization ... 10 If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. If an object that has static storage duration is not initialized explicitly, then: — if it has pointer type, it is initialized to a null pointer; — if it has arithmetic type, it is initialized to (positive or unsigned) zero; — if it is an aggregate, every member is initialized (recursively) according to these rules; — if it is a union, the first named member is initialized (recursively) according to these rules.
|
|
|
|
|
Apr 25 2008, 14:48
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(777777 @ Apr 25 2008, 14:56)  Да ну, давно ли? Может еще пунктик стандарта укажете, в котором это предписывается? ... А в С++ он тоже инициализирует? Сначала обнуляет всю память, а котом начинает вызывать конструкторы? Несколько глупо, не так ли? А разве avr-gcc зануляет ВСЮ память? Цитата(aesok @ Apr 25 2008, 16:56)  До кучи, стандарт С 1989 года (почти 20 лет!): http://megaton.obfuscated.net/~orange/deve...raft.html#3.5.7Цитата 3.5.7 Initialization ... If an object that has static storage duration is not initialized explicitly, it is initialized implicitly as if every ember that has arithmetic type were assigned 0 and every member that has pointer type were assigned a null pointer constant. If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. Насколько я помню, в до-ansi-шном С на "Электронике-60" было так же. Теперь стандарт С++ Цитата 8.5 Initializers ... 5 To zero-initialize an object of type T means: — if T is a scalar type (3.9), the object is set to the value of 0 (zero) converted to T; — if T is a non-union class type, each nonstatic data member and each base-class subobject is zeroinitialized; — if T is a union type, the object’s first named data member89) is zero-initialized; — if T is an array type, each element is zero-initialized; — if T is a reference type, no initialization is performed. To default-initialize an object of type T means: — if T is a non-POD class type (clause 9), the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor); — if T is an array type, each element is default-initialized; — otherwise, the object is zero-initialized. default-инициализация применяется тогда, когда инициализатор не задан явно.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Apr 25 2008, 15:16
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(zltigo @ Apr 25 2008, 17:16)  Существует - для определенности она инициализируется нулем. Для инициализвции случайным числом существуют генераторы случайных чисел, однако. Очень смешно. Цитата(zltigo @ Apr 25 2008, 17:16)  Инициализируйте. Никто не запрещает. Глупо, это то, что Вы тут пропагандируете. Вообще-то инициализация занимает программную память, которой и так немного. Вы считаете глупостью желание ее сэкономить?
Сообщение отредактировал 777777 - Apr 25 2008, 15:17
|
|
|
|
|
Apr 25 2008, 15:24
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(777777 @ Apr 25 2008, 18:16)  Вообще-то инициализация занимает программную память, которой и так немного. Вы считаете глупостью желание ее сэкономить? Откройте любой учебник по си. ВСЕГДА рекомендуется инициализировать переменные, иначе в них может находиться всё что угодно. Хорошо, если компилятор туда хотя бы 0 занесёт. ЗАТО: будет 100% уверенность в том, что находится в переменной
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Apr 25 2008, 16:08
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(777777 @ Apr 25 2008, 17:16)  Вообще-то инициализация занимает программную память, которой и так немного. Программной памяти по нынешним временам "немного" бывает крайне редко. Процедура инициализации занимает порядка 5-10 команд. Цитата Вы считаете глупостью желание ее сэкономить? С учетом эффектов, которых придется получить при работе с неициализированной памятью - это глупость. А с учетом того, что с неициализированной памятью вообще работать невозможно, то ручная индивидуальная инициализация (даже нескольких переменных) займет ресурсов больше, нежели простейшее обнуление всего массива переменных чохом в цикле. И это уже глупость в квадрате.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 25 2008, 16:40
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(zltigo @ Apr 25 2008, 20:08)  Программной памяти по нынешним временам "немного" бывает крайне редко. бывает и еще как... Цитата С учетом эффектов, которых придется получить при работе с неициализированной памятью - это глупость. А с учетом того, что с неициализированной памятью вообще работать невозможно, то ручная индивидуальная инициализация (даже нескольких переменных) займет ресурсов больше, нежели простейшее обнуление всего массива переменных чохом в цикле. И это уже глупость в квадрате. Атлична, тогда попробуйте обосновать наличие Retention памяти на некотоорых продвинутых чипах ... This LSI has an on-chip high-speed RAM, which achieves fast access, and an on-chip RAM for data retention, which can retain data in deep standby mode. These memory units can be used to store instructions or data.
|
|
|
|
|
Apr 25 2008, 16:55
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(singlskv @ Apr 25 2008, 18:40)  бывает и еще как... Типа пишите на "C", не хватает 10 байт, где ужать не знаете - последний шанс убрать инициализацию памяти и посмотреть что получится. Извините, так, не бывает. (От комментариев у кого так бывает воздержусь  ) Цитата Атлична, тогда попробуйте обосновать наличие Retention памяти на некотоорых продвинутых чипах ... Это вы вообще к чему а? К тому, что бывает неинициализированная память? Так я ее десять раз на дню пользую - получаю от мененджера памяти на любом, а не только на 'продвинутом' чипе и пользую с ОСТОРОЖНОСТЬЮ и трачу РЕСУРСЫ на начальную инициализацию, там где не обойтись. Какое это отношение имеет к желанию "сэкономить" на инициализации сегмента с "неициализированными" переменными в startup?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 25 2008, 18:42
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(zltigo @ Apr 25 2008, 20:55)  Типа пишите на "C", не хватает 10 байт, где ужать не знаете - последний шанс убрать инициализацию памяти и посмотреть что получится. Извините, так, не бывает. (От комментариев у кого так бывает воздержусь  ) Ну ваще-то бывает, ну ни как не получится разместить 16 армов на одной плате, вот 16 тини24 влезают, а 16 даже минимальных арм + обвязка ну ни как не влезут  Цитата Это вы вообще к чему а? К тому, что бывает неинициализированная память? Так я ее десять раз на дню пользую - получаю от мененджера памяти на любом, а не только на 'продвинутом' чипе и пользую с ОСТОРОЖНОСТЬЮ и трачу РЕСУРСЫ на начальную инициализацию, там где не обойтись. Какое это отношение имеет к желанию "сэкономить" на инициализации сегмента с "неициализированными" переменными в startup? А разьве кто-то собирался экономить ? кажись Вы не внимательно читали топик, задачка не экономить а сохранить значения после перезагрузки, например после WDT
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|