|
Вопрос по оптимизации. |
|
|
|
 |
Ответов
(1 - 12)
|
Feb 10 2015, 09:49
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Jenya7 @ Feb 10 2015, 10:49)  тогда я не понимаю. мне что все переменные volatile сделать? он даже локальные optimaze out! Если хотите написать большую медленную программу - делайте все переменные volatile. Если хотите писать маленькую быструю - ходите по дизассемблеру, анализируйте код и смотрите содержимое регистров. В каком-то из них может быть ваша преременная. Причем по ходу программы она может перемещаться из регистра в регистр. А может компилятор действительно выкинул переменную вместе со всем породившим ее кодом. Бывает удобно на время отладки завести volatile-переменные, в которые записывать промежуточнве значения интересующих вас переменных в ключевых точках программы. Если хотите программу среднего размера и скорости, но с облегченной отладкой - уменьшайте оптимизацию.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 10 2015, 10:09
|

Местный
  
Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502

|
Цитата(Jenya7 @ Feb 10 2015, 07:47)  Когда я в компайлере ставлю директиву оптимизировать по скорости то в дебаг моде при переходе на какую нибудь переменную дебагер пишет optimized out. вопрос влияет ли оптимизация на работу переменных в run time? Хм.. обычно в debug mode все оптимизации отключаются, чтобы компилятор что-нибуть не выкинул, полезное для отладки. А в release оптимизации включаются; кого волнует, что умный компилятор там выкинет. А выкинуть он может очень много, заинлайнить все static функции итп. Бывают, конечно, случаи, когда debug версия просто не лезет в ROM, например, приходится извращаться с отладкой в релизе. ...А бывают еще случаи, когда горе-программисты пишут код, который в дебаге работает, а в релизе - нет
|
|
|
|
|
Feb 10 2015, 10:20
|

Местный
  
Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502

|
Цитата(Jenya7 @ Feb 10 2015, 10:10)  мне кажется что optimized out переменная сохранит свою функциональность. может он ее засунул в регистр а не в стек вот и optimized out. креститься надо, когда кажется  void foo(int arg1) { int var1 = 23; var1 += arg1; printf("%d", var1); } в release переменная var1 просто не будет существовать. тоесть вообще.
|
|
|
|
|
Feb 10 2015, 11:03
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(CrimsonPig @ Feb 10 2015, 16:20)  креститься надо, когда кажется  void foo(int arg1) { int var1 = 23; var1 += arg1; printf("%d", var1); } в release переменная var1 просто не будет существовать. тоесть вообще. что то вы ужасами какими то нас стращаете. вопрос даже не в том будет существовать или нет, а в том сохраниться ли функциональность.
Сообщение отредактировал Jenya7 - Feb 10 2015, 11:06
|
|
|
|
|
Feb 10 2015, 11:40
|

Местный
  
Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502

|
Цитата(Jenya7 @ Feb 10 2015, 11:03)  что то вы ужасами какими то нас стращаете. вопрос даже не в том будет существовать или нет, а в том сохраниться ли функциональность. а не будет ли благородный дон дать определенние этой самой "функциональности" ? А то получатся разговор ни о чем. В моем примере локальная переменная с т.з. умного оптимизирующего компилятора никакой _функциональности_ не несет. Поэтому в релизе она будет соптимизирована до инструкции прибавления константы к аргументу и никакого места на стеке ей выделено не будет. В дебаге оптимизации отключены обычно и эта переменная будет выделена на стеке. Вы думаете что злобный буржуйский оптимизирующий компилятор попытается вас нае...ть и сгенерировать код, который делает то, что его не просят или не то, что задумал гениальный программист ? Так это решается формально, прогоном соотв. тестов в дебаге и релизе и курением результатов тестов.
Сообщение отредактировал CrimsonPig - Feb 10 2015, 11:43
|
|
|
|
|
Feb 10 2015, 11:56
|

Местный
  
Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502

|
Цитата(Jenya7 @ Feb 10 2015, 11:50)  ну да 32кило кода, пойди прогони сейчас.  . Даже не смешно. У меня в одном из проектов есть такой файлец sqlite3.c Он содержит более 5 мегабайт исходного кода. По заявлению автора, код покрыт тестами на 100%.
Сообщение отредактировал CrimsonPig - Feb 10 2015, 11:56
|
|
|
|
|
Feb 10 2015, 14:02
|

Профессионал
    
Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143

|
Цитата(CrimsonPig @ Feb 10 2015, 14:40)  В дебаге оптимизации отключены обычно и эта переменная будет выделена на стеке. на анализе работы IAR AVR/ARM могу сказать что: локальные переменные размещаются на стеке когда уже не хватает регистров. Либо при переходе в функции, когда нужно для вызова высвободить требуемые регистры то есть первоочередное размещение локальных переменных в регистрах, а уж потом на стеке.
P.S. предполагаю что и в других компиляторах такой же механизм
--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|