И спрашивается, какого хера сначала пихать переменные в память, потом их оттуда считывать и только потом делать сложение, когда в распоряжении 32 регистра.
спрашивается, какого хера сначала пихать переменные в память, потом их оттуда считывать и только потом делать сложение, когда в распоряжении 32 регистра.
Я знаю ответ от самих разрабов этих компиляторов, они оставляют рон под свои промежуточные нужды, когда cvavr сначала работает с рон, а потом при нехватке уже лезет в память, что логично, т.к. человек именно так бы эту программу и написал. Не знаю как в winavr, а в иаре в настройках можно его заставить разместить нужную переменную в конкретном регистре.
Я не знаю, кто такие разрабы, но то, что ты написал - это бред.
А твой пример кода - это как раз демонстрация того, что писали выше: про то, что говнокод - он не от компилятора, а от программиста.
Если совсем не знать языка и писать на нём, как в начале восьмидесятых, то и результат будет как в начале восьмидесятых. А если выключить к чертям всю оптимизацию, то понятно, что оптимизаторы ни хрена не работают.
И спрашивается, какого хера сначала пихать переменные в память, потом их оттуда считывать и только потом делать сложение, когда в распоряжении 32 регистра.
Вот передергивать не надо - Вы объявили переменные и компилятор отвел под них место и,заметьте, не в регистре, а в физической памяти. Он не может угадать, что переменных у Вас менее 32, да и регистры используются совсем не для хранения переменных.
Какой такой мой пример кода? Код в одну сточку, сложить, мля, два числа x и y, вот и весь код. И на скринах дизасм этого кода от разных компиляторов.
Ну, не в одну, допустим.
Начнём с того, что там выключен оптимизатор и используется неизвестный компилятор. Здесь форум по ардуино, поэтому давай исходить из того, что компилятор - GCC, а оптимизация Os - как в ардуино из коробки (чтобы на одном языке говорить).
Показать тебе как выглядит твой код в этом компиляторе с этими условиями? Или сам посмотришь? А заодно, как выглядит этот же код, но правильно написанный?
Он не может угадать, что переменных у Вас менее 32
Компилятору ничего гадать и не надо, перед ним текст программы, тем более, что он многопроходный. Без оптимизатора компилятор может построить какой угодно топорный код, заложенный в него разрабоччиками, но дальше - как раз работа оптимизатора, по минимизации и оптимизации использования регистров, выкидывании неиспользуемых результатов вычислений и т.д. Я к тому, что никто, кроме человека, (грамотного человека) не выполнит эту работу лучше чем самый крутой оптимизатор, и, в этом смысле, как я и сказал, за последние 20 лет мало что изменилось.
Показать тебе как выглядит твой код в этом компиляторе с этими условиями? Или сам посмотришь? А заодно, как выглядит этот же код, но правильно написанный?
Посмотрел, команда STS 0x0061,R24Store direct to data space как была так и осталась.
А по теме могу сказать, что на ассемблере я писал в 3-х случаях - когда экономил батарейку и запускал процессор на 32кГц, когда не было нормального компилятора си и когда надо было поменять страницу экрана, запустив программу с экранной памяти (еще на БК11). И больше - никогда.
Намного важнее, ИМХО, для программиста умение читать даташиты и правильно их понимать. Особенно, если они написаны на китайском :)
И да, если б Вы видели какую ахинею генерит Дельфи, хоть и с оптимизатором, у вас бы началось перманентное выпадение глаз. Кста, С++ от Борланда этим тоже грешит. :)
самый одекватный компилятор, который мне попадался был Zortech C++ еще для DOS-а, году так в 92-м. На тот момент я не мог оптимизировать код, который он генерил. Я у него, можно сказать, учился. :)
объяснить, что если нормально знать язык, то очевидно, что компилятор обязан положить их в память и никакой оптимизатор этого не обойдёт, т.к. их просто нельзя из памяти выбросить.
Заодно могу показать как писать правильно, чтобы в памяти и в коде вообще ничего не осталось - всё нахрен ушло. И ещё интересные примеры оптимизации показать.
Если спросит - объясню.
А сорвался на хамство, ну извините ещё раз - не люблю, когда люди не зная языка и не понимая как работает компилятор, начинаю свои "приговоры" выносить.
Посмотрел, команда STS 0x0061,R24Store direct to data space как была так и осталась.
Ну, правильно - он не имеет права её выбросить и никогда не выбросит. Ты так написал пример.
Слушай, это занимает много времени. Посмотри мой предыдущий пост. Если тебе надо объяснить что там и как - скажи я объясню. Если не надо (ты от "разрабов" всё знаешь), то давай разбежимся.
Ну, правильно - он не имеет права её выбросить и никогда не выбросит. Ты так написал пример.
Ага, т.е. те, кто писал CodeVision совсем дибилы, т.к. даже не пытались использовать эту команду когда видно что программа складывает два числа и на этом завершает свою работу и для такой задачи 32 рона куда более, чем достаточно, а размер будет в три раза меньше и выполнится в три раза быстрее. Надо им написать, что они что-то по жизни неправильно делают и еще продают свой недокомпилятор за 145 евро.
объяснить, что если нормально знать язык, то очевидно, что компилятор обязан положить их в память и никакой оптимизатор этого не обойдёт, т.к. их просто нельзя из памяти выбросить.
Заодно могу показать как писать правильно, чтобы в памяти и в коде вообще ничего не осталось - всё нахрен ушло. И ещё интересные примеры оптимизации показать.
"Предварительная отимизация есть зло!"(с)... )))))
Я не знаю, кто "дибил", а кто нет. Я знаю, что так, как у тебя написано - ни один оптимизатор не выбросит работу с памятью. Тот, кто утверждает обратное - просто не знает языка Си (и СИ++ тоже).
Я уже говорил тебе, если тебе интересно узнать, я готов объяснить, если нет - давай разбегаться, а то добром это не кончится.
Пока переменных мало... их ещё как-то можно в голове держать...
Когда проект большой... и переменных очень много... АСМ уже не для среднестатистического мозга... пусть этим Си и занимается... На больших проектах АСМ продувает Си... и по быстродействию... и по размеру кода... Такова жизнь...
Я не знаю, кто "дибил", а кто нет. Я знаю, что так, как у тебя написано - ни один оптимизатор не выбросит работу с памятью. Тот, кто утверждает обратное - просто не знает языка Си (и СИ++ тоже).
Чего спорить... кодевижен - яркий представитель полувсевдонедо Си... Это факт... и спор тут неуместен...
Ага, т.е. те, кто писал CodeVision совсем дибилы, т.к. даже не пытались использовать эту команду когда видно что программа складывает два числа и на этом завершает свою работу и для такой задачи 32 рона куда более, чем достаточно, а размер будет в три раза меньше и выполнится в три раза быстрее. Надо им написать, что они что-то по жизни неправильно делают и еще продают свой недокомпилятор за 145 евро.
Не надо писать... они сами это знают... Никто в здравом уме... а тем более профи... кодевижэн не юзает... это моветон...
Ну посмотри первую картинку. Где ты там узрел хоть намек работы с памятью?
Описание глобалов это и есть работа с памятью. При некоторых настройках их тоже выкинет. Ты ж не в боевой системе компилировал, а на каком нибудь сайте, так?
Ну посмотри первую картинку. Где ты там узрел хоть намек работы с памятью?
Как где, а "х=10;" это что?
Слушай, друг, я тебе в третий и в последний раз говорю (больше повторять не буду), твоё непонимание происходит от незнания языка. Я готов объяснить, если ты скажешь, что готов слушать. Или давай вот прямо сейчас прекратим и разбежимся. Если же будешь продолжать наскакивать - просто включу метод Овечкина.
Уж совсем "при некоторых". Это неэквивалентное преобразование - их нельзя выкидывать. Вернее так: в программе недостаточно информации для того, чтобы принять решение можно их выбрасывать или нет. Разве что супероптимизатор запросит дополнительную информацию от юзера через специальные опции или ещё как.
Не выкинет. Класть при старте все переменные в память будут по-любому. Кроме CVAVR, тот начнет раскидывать по ронам, а уж потом совать в память. Эту фишку сегодня вспомнил и решил еще раз убедиться. Первый раз увидел лет семь-восемь назад. А вот не начни я с ассемблера в своей жизни, то может быть и не заметил такую фигню. ))
wdrakula пишет:
Ты ж не в боевой системе компилировал, а на каком нибудь сайте, так?
Как это не в боевой, вот: cvavr, iar и avrstudio c gcc, который собственно и в arduino ide.
всё, R30 и R4 это регистры общего назначения. Работа с ОЗУ (которая дальше в адресном пространстве) ведется командами LD и ST, которых тут и в помине нет. А между рон и озу есть еще регистры портов, для которых свои команды, прикинь.
Зависит от настроек... прекомпилятор в уме посчитает... и останется только результат... без математики... )))))))
Правильно, но результат всё равно сохранит в ОЗУ, а не оставит в РОН. Т.е. выполнит лишнюю команду, которая по сути нахер не нужна, программа дальше не работает.
Вот что делает GCC при -Os
Как видим, в уме то он посчитал, но мало того, что результат сохранил в ОЗУ (1E по адресу 0x60), так не только результат, но и цифру 20 тоже туда засунул (0x14 по адресу 0x61). Спрашивается, нафига эта переменная ему нужна и чем она лучше 10, которую он предпочел не сохранять?
Зависит от настроек... прекомпилятор в уме посчитает... и останется только результат... без математики... )))))))
Правильно, но результат всё равно сохранит в ОЗУ, а не оставит в РОН. Т.е. выполнит лишнюю команду, которая по сути нахер не нужна, программа дальше не работает.
И что это меняет??? Выкинул??? Выкинул... С задачей справился??? Типа справился... )))))))))))))
Как нафига? Она же глобальная. Как же он её выбросит?
Та с этим разобрались, тут всё логично, одну он отбросил т.к. она перезаписывается и уже того значения принять не сможет. Вопрос про запись в память, тратя еще кучу тактов на чтение и запись.
Еще раз картинку, если кто не видел.
Пройдемся по строкам:
1. Записали в R16 число 10, окей,
2. Записали в R30 адрес памяти ($60), в который мы сохраним это число. Тут возникает логический вопрос, зачем? Если мы потом в регистр R16 все равно его считаем и в конечном итоге мы выполняем команду ADD R16, R17, т.к. сложить ячейки памяти озу невозможно, это всё равно должно происходить в ронах, так какого фига их пихать в озу, если значения уже регистрах, бери да добавляй, здесь нет смысла в озу как таковом. В тини12 ваще нет озу физически, тем не менее написано куча программ под этот мк на одних ронах, и что характерно, под этот мк можно писать исключительно на асме, т.к. си будет искать и пытаться записать всю чухню в озу, что совсем не обязательно.
Я перечитал Вашу пикировку с Володькой - Вы его (и меня) троллите или правда не понимаете зачем?
Потому, что это Си - язык такой. И в этом языке глобальную переменную нельзя соптимизировать и выбросить - она обязана иметь своё место в памяти. Иначе в программе может всё сломаться.
Т.е. просто теоретически нельзя убрать - нет никакого способа у компилятора узнать, что она не нужна.
Вот Вы говорите, что мол эта переменная больше ни для чего не нужна, так нафига её вообще в память помещать? А кто Вам сказал, что не нужна? Потому, что Вам известно, что в программе нет другого файла в котором она объявлена как extern и из которого к ней есть доступ. А компилятору откуда про это знать? Он ведь (компилятор) всегда работает с одним файлом и ни о каких других вообще ничего не знает. Ну, выбросите Вы её - а как быть с тем другим файлом, если он вдруг есть?
Более того, даже если её сделать static (недоступной из других файлов), её все равно нельзя лишать памяти Хотя здесь уже вещи более тонкие, не хочу в теорию компиляции особо вдаваться, но поверьте мне - нельзя. В основном это связано с тем, что она уже получила значение ... ладно не полезу, но поверьте - нельзя её выбросить по той же причинам - у компилятора не способа убедиться в эквивалентности такого преобразования.
Зато, если бы Вы сделали её локальной - она бы памяти и не коснулась. Её бы выбросили нафиг, далеко и сразу. Попробуйте - её в коде вообще не будет!
__Alexander пишет:
под этот мк можно писать исключительно на асме, т.к. си будет искать и пытаться записать всю чухню в озу
Ну, правильно - он (Си) не может по-другому, ну вот такой это язык! Надеюсь, я понятно объяснил почему.
Если Вы хотите придумать "Си только для одного файла и без глобальной инициализации" - пожалуйста, там можно будет соптимизировать, но это уже другой язык будет - не Си.
А про компиляторы Вы зря так - "ничего не изменилось" я тут на форуме выкладывал изумительные результаты оптимизации.
Потому, что это Си - язык такой. И в этом языке глобальную переменную нельзя соптимизировать и выбросить - она обязана иметь своё место в памяти. Иначе в программе может всё сломаться.
Хватит уже нести чушь... еще раз... для тех кто плохо слышит... или не знает...
Цитата:
Всё что не покрыто volatile... на усмотрение оптимизатора...
Я первый написал, что ничего не поменялось за 20 лет. Человек может соптимизировать лучше любого шаблонного оптимизатора. Ну, если это грамотный человек. Ты пикировку сначала читал?
Потому, что это Си - язык такой. И в этом языке глобальную переменную нельзя соптимизировать и выбросить - она обязана иметь своё место в памяти. Иначе в программе может всё сломаться.
Хватит уже нести чушь... еще раз... для тех кто плохо слышит... или не знает...
Цитата:
Всё что не покрыто volatile... на усмотрение оптимизатора... точка...
Проверил, ниче не изменилось.
Вот код на сложение двух переменных от cvavr:
А вот от наших всяких иаров и gcc:
И спрашивается, какого хера сначала пихать переменные в память, потом их оттуда считывать и только потом делать сложение, когда в распоряжении 32 регистра.
Проверил, ниче не изменилось.
Ну оть.
Проверил, ниче не изменилось.
Где? В твоей голове?
спрашивается, какого хера сначала пихать переменные в память, потом их оттуда считывать и только потом делать сложение, когда в распоряжении 32 регистра.
А если подумать? Может найдёшь ответ?
А если подумать? Может найдёшь ответ?
Я знаю ответ от самих разрабов этих компиляторов, они оставляют рон под свои промежуточные нужды, когда cvavr сначала работает с рон, а потом при нехватке уже лезет в память, что логично, т.к. человек именно так бы эту программу и написал. Не знаю как в winavr, а в иаре в настройках можно его заставить разместить нужную переменную в конкретном регистре.
Я знаю ответ от самих разрабов этих компиляторов
Я не знаю, кто такие разрабы, но то, что ты написал - это бред.
А твой пример кода - это как раз демонстрация того, что писали выше: про то, что говнокод - он не от компилятора, а от программиста.
Если совсем не знать языка и писать на нём, как в начале восьмидесятых, то и результат будет как в начале восьмидесятых. А если выключить к чертям всю оптимизацию, то понятно, что оптимизаторы ни хрена не работают.
Ворота, держи дискуссию в рамках, не скатывайся в хамство, ты ж не rkit.
А твой пример кода - это как раз демонстрация того, что писали выше: про то, что говнокод - он не от компилятора, а от программиста.
Какой такой мой пример кода? Код в одну сточку, сложить, мля, два числа x и y, вот и весь код. И на скринах дизасм этого кода от разных компиляторов.
И спрашивается, какого хера сначала пихать переменные в память, потом их оттуда считывать и только потом делать сложение, когда в распоряжении 32 регистра.
Вот передергивать не надо - Вы объявили переменные и компилятор отвел под них место и,заметьте, не в регистре, а в физической памяти. Он не может угадать, что переменных у Вас менее 32, да и регистры используются совсем не для хранения переменных.
Прошу прощения за излишнюю резкость.
Какой такой мой пример кода? Код в одну сточку, сложить, мля, два числа x и y, вот и весь код. И на скринах дизасм этого кода от разных компиляторов.
Ну, не в одну, допустим.
Начнём с того, что там выключен оптимизатор и используется неизвестный компилятор. Здесь форум по ардуино, поэтому давай исходить из того, что компилятор - GCC, а оптимизация Os - как в ардуино из коробки (чтобы на одном языке говорить).
Показать тебе как выглядит твой код в этом компиляторе с этими условиями? Или сам посмотришь? А заодно, как выглядит этот же код, но правильно написанный?
Он не может угадать, что переменных у Вас менее 32
Компилятору ничего гадать и не надо, перед ним текст программы, тем более, что он многопроходный. Без оптимизатора компилятор может построить какой угодно топорный код, заложенный в него разрабоччиками, но дальше - как раз работа оптимизатора, по минимизации и оптимизации использования регистров, выкидывании неиспользуемых результатов вычислений и т.д. Я к тому, что никто, кроме человека, (грамотного человека) не выполнит эту работу лучше чем самый крутой оптимизатор, и, в этом смысле, как я и сказал, за последние 20 лет мало что изменилось.
короче, не ссорьтесь, не та тема, я пошёл уже закусь готовить и принимать дезинфицирующее. чего и вам желаю.
Показать тебе как выглядит твой код в этом компиляторе с этими условиями? Или сам посмотришь? А заодно, как выглядит этот же код, но правильно написанный?
Посмотрел, команда STS 0x0061,R24 Store direct to data space как была так и осталась.
А по теме могу сказать, что на ассемблере я писал в 3-х случаях - когда экономил батарейку и запускал процессор на 32кГц, когда не было нормального компилятора си и когда надо было поменять страницу экрана, запустив программу с экранной памяти (еще на БК11). И больше - никогда.
Намного важнее, ИМХО, для программиста умение читать даташиты и правильно их понимать. Особенно, если они написаны на китайском :)
И да, если б Вы видели какую ахинею генерит Дельфи, хоть и с оптимизатором, у вас бы началось перманентное выпадение глаз. Кста, С++ от Борланда этим тоже грешит. :)
самый одекватный компилятор, который мне попадался был Zortech C++ еще для DOS-а, году так в 92-м. На тот момент я не мог оптимизировать код, который он генерил. Я у него, можно сказать, учился. :)
Я не ссорюсь, и уже извинился.
Я действительно готов реально объяснить человеку
объяснить, что если нормально знать язык, то очевидно, что компилятор обязан положить их в память и никакой оптимизатор этого не обойдёт, т.к. их просто нельзя из памяти выбросить.
Заодно могу показать как писать правильно, чтобы в памяти и в коде вообще ничего не осталось - всё нахрен ушло. И ещё интересные примеры оптимизации показать.
Если спросит - объясню.
А сорвался на хамство, ну извините ещё раз - не люблю, когда люди не зная языка и не понимая как работает компилятор, начинаю свои "приговоры" выносить.
Посмотрел, команда STS 0x0061,R24 Store direct to data space как была так и осталась.
Ну, правильно - он не имеет права её выбросить и никогда не выбросит. Ты так написал пример.
Слушай, это занимает много времени. Посмотри мой предыдущий пост. Если тебе надо объяснить что там и как - скажи я объясню. Если не надо (ты от "разрабов" всё знаешь), то давай разбежимся.
От квалификации код зависит больше, чем от самого крутого оптимизатора
Ага... ну-ну... )))))))))))
Если так прёт от собственной "квалификации"... то ваш удел АСМ... и ничто другое... ибо любой Си будет не такой... )))))))))))
Ну, правильно - он не имеет права её выбросить и никогда не выбросит. Ты так написал пример.
Ага, т.е. те, кто писал CodeVision совсем дибилы, т.к. даже не пытались использовать эту команду когда видно что программа складывает два числа и на этом завершает свою работу и для такой задачи 32 рона куда более, чем достаточно, а размер будет в три раза меньше и выполнится в три раза быстрее. Надо им написать, что они что-то по жизни неправильно делают и еще продают свой недокомпилятор за 145 евро.
https://www.codevision.be/codevisionavr-c-105/codevisionavrcompiler?zeni...
Если так прёт от собственной "квалификации"
Меня не прёт, я не программист.
объяснить, что если нормально знать язык, то очевидно, что компилятор обязан положить их в память и никакой оптимизатор этого не обойдёт, т.к. их просто нельзя из памяти выбросить.
Заодно могу показать как писать правильно, чтобы в памяти и в коде вообще ничего не осталось - всё нахрен ушло. И ещё интересные примеры оптимизации показать.
"Предварительная отимизация есть зло!"(с)... )))))
[видно что программа складывает два числа и на этом завершает свою работу и для такой задачи 32 рона куда более
не два числа, а две глобальные переменные. разницу чуешь?
Ага, т.е. те, кто писал CodeVision совсем дибилы,
Я не знаю, кто "дибил", а кто нет. Я знаю, что так, как у тебя написано - ни один оптимизатор не выбросит работу с памятью. Тот, кто утверждает обратное - просто не знает языка Си (и СИ++ тоже).
Я уже говорил тебе, если тебе интересно узнать, я готов объяснить, если нет - давай разбегаться, а то добром это не кончится.
не два числа, а две глобальные переменные. разницу чуешь?
Да хоть локальные )))
ни один оптимизатор не выбросит работу с памятью.
Ну посмотри первую картинку. Где ты там узрел хоть намек работы с памятью?
Если так прёт от собственной "квалификации"
Меня не прёт, я не программист.
Отож...
Пока переменных мало... их ещё как-то можно в голове держать...
Когда проект большой... и переменных очень много... АСМ уже не для среднестатистического мозга... пусть этим Си и занимается... На больших проектах АСМ продувает Си... и по быстродействию... и по размеру кода... Такова жизнь...
Я не знаю, кто "дибил", а кто нет. Я знаю, что так, как у тебя написано - ни один оптимизатор не выбросит работу с памятью. Тот, кто утверждает обратное - просто не знает языка Си (и СИ++ тоже).
Чего спорить... кодевижен - яркий представитель полувсевдонедо Си... Это факт... и спор тут неуместен...
Ага, т.е. те, кто писал CodeVision совсем дибилы, т.к. даже не пытались использовать эту команду когда видно что программа складывает два числа и на этом завершает свою работу и для такой задачи 32 рона куда более, чем достаточно, а размер будет в три раза меньше и выполнится в три раза быстрее. Надо им написать, что они что-то по жизни неправильно делают и еще продают свой недокомпилятор за 145 евро.
Не надо писать... они сами это знают... Никто в здравом уме... а тем более профи... кодевижэн не юзает... это моветон...
ни один оптимизатор не выбросит работу с памятью.
Ну посмотри первую картинку. Где ты там узрел хоть намек работы с памятью?
Описание глобалов это и есть работа с памятью. При некоторых настройках их тоже выкинет. Ты ж не в боевой системе компилировал, а на каком нибудь сайте, так?
Ну посмотри первую картинку. Где ты там узрел хоть намек работы с памятью?
Как где, а "х=10;" это что?
Слушай, друг, я тебе в третий и в последний раз говорю (больше повторять не буду), твоё непонимание происходит от незнания языка. Я готов объяснить, если ты скажешь, что готов слушать. Или давай вот прямо сейчас прекратим и разбежимся. Если же будешь продолжать наскакивать - просто включу метод Овечкина.
При некоторых настройках их тоже выкинет
Не выкинет. Класть при старте все переменные в память будут по-любому. Кроме CVAVR, тот начнет раскидывать по ронам, а уж потом совать в память. Эту фишку сегодня вспомнил и решил еще раз убедиться. Первый раз увидел лет семь-восемь назад. А вот не начни я с ассемблера в своей жизни, то может быть и не заметил такую фигню. ))
Как это не в боевой, вот: cvavr, iar и avrstudio c gcc, который собственно и в arduino ide.
Как где, а "х=10;" это что?
x=10 раскладывается на команды:
LDI R30, 10 и MOV R4, R30
всё, R30 и R4 это регистры общего назначения. Работа с ОЗУ (которая дальше в адресном пространстве) ведется командами LD и ST, которых тут и в помине нет. А между рон и озу есть еще регистры портов, для которых свои команды, прикинь.
Не выкинет. Класть при старте все переменные в память будут по-любому.
Тануна... ЖЦЦ... серьёзно??? ))))
Зависит от настроек... прекомпилятор в уме посчитает... и останется только результат... без математики... )))))))
LDI R30, 10 и MOV R4, R30
Ну, я всё понял. Думал, ты просто не знаешь языка, а ты ещё и не желаешь знать. До свиданья.
И не только глобал... а и локальные может выкинуть... ))))
Агрессивная оптимизация... она такая... Ещё и порядок действий... перевернуть может... code reordering называется...
Зависит от настроек... прекомпилятор в уме посчитает... и останется только результат... без математики... )))))))
Глобальную переменную?
Блин, на вас что коронавирус так на всех повлиял? Чёта уровень беда зашкалил.
Тануна... ЖЦЦ... серьёзно??? ))))
Зависит от настроек... прекомпилятор в уме посчитает... и останется только результат... без математики... )))))))
Правильно, но результат всё равно сохранит в ОЗУ, а не оставит в РОН. Т.е. выполнит лишнюю команду, которая по сути нахер не нужна, программа дальше не работает.
Вот что делает GCC при -Os
Как видим, в уме то он посчитал, но мало того, что результат сохранил в ОЗУ (1E по адресу 0x60), так не только результат, но и цифру 20 тоже туда засунул (0x14 по адресу 0x61). Спрашивается, нафига эта переменная ему нужна и чем она лучше 10, которую он предпочел не сохранять?
Глобальную переменную?
На таких простых примерах ??? Да как два пальца... )))))))))
Всё что не покрыто volatile... на усмотрение оптимизатора... ))))))))
Тануна... ЖЦЦ... серьёзно??? ))))
Зависит от настроек... прекомпилятор в уме посчитает... и останется только результат... без математики... )))))))
Правильно, но результат всё равно сохранит в ОЗУ, а не оставит в РОН. Т.е. выполнит лишнюю команду, которая по сути нахер не нужна, программа дальше не работает.
И что это меняет??? Выкинул??? Выкинул... С задачей справился??? Типа справился... )))))))))))))
Глобальную переменную?
На таких простых примерах ??? Да как два пальца... )))))))))
Бредите, сударь. Пример в студию!
А ещё лучше, изучите, наконец язык (вместе с Александром), чтобы понимать, что выбрасывать эту переменную компилятор просто не может.
Бредите, сударь. Пример в студию!
Остыньте... и не позорьтесь...
Пример двумя постами выше... выбросил и не подавился... )))))))
Пример двумя постами выше... выбросил и не подавился... )))))))
Где? Не вижу! Брехать не мешки ворочать.
Как нафига? Она же глобальная. Как же он её выбросит?
Та с этим разобрались, тут всё логично, одну он отбросил т.к. она перезаписывается и уже того значения принять не сможет. Вопрос про запись в память, тратя еще кучу тактов на чтение и запись.
Еще раз картинку, если кто не видел.
Пройдемся по строкам:
1. Записали в R16 число 10, окей,
2. Записали в R30 адрес памяти ($60), в который мы сохраним это число. Тут возникает логический вопрос, зачем? Если мы потом в регистр R16 все равно его считаем и в конечном итоге мы выполняем команду ADD R16, R17, т.к. сложить ячейки памяти озу невозможно, это всё равно должно происходить в ронах, так какого фига их пихать в озу, если значения уже регистрах, бери да добавляй, здесь нет смысла в озу как таковом. В тини12 ваще нет озу физически, тем не менее написано куча программ под этот мк на одних ронах, и что характерно, под этот мк можно писать исключительно на асме, т.к. си будет искать и пытаться записать всю чухню в озу, что совсем не обязательно.
Тут возникает логический вопрос, зачем?
Я перечитал Вашу пикировку с Володькой - Вы его (и меня) троллите или правда не понимаете зачем?
Потому, что это Си - язык такой. И в этом языке глобальную переменную нельзя соптимизировать и выбросить - она обязана иметь своё место в памяти. Иначе в программе может всё сломаться.
Т.е. просто теоретически нельзя убрать - нет никакого способа у компилятора узнать, что она не нужна.
Вот Вы говорите, что мол эта переменная больше ни для чего не нужна, так нафига её вообще в память помещать? А кто Вам сказал, что не нужна? Потому, что Вам известно, что в программе нет другого файла в котором она объявлена как extern и из которого к ней есть доступ. А компилятору откуда про это знать? Он ведь (компилятор) всегда работает с одним файлом и ни о каких других вообще ничего не знает. Ну, выбросите Вы её - а как быть с тем другим файлом, если он вдруг есть?
Более того, даже если её сделать static (недоступной из других файлов), её все равно нельзя лишать памяти Хотя здесь уже вещи более тонкие, не хочу в теорию компиляции особо вдаваться, но поверьте мне - нельзя. В основном это связано с тем, что она уже получила значение ... ладно не полезу, но поверьте - нельзя её выбросить по той же причинам - у компилятора не способа убедиться в эквивалентности такого преобразования.
Зато, если бы Вы сделали её локальной - она бы памяти и не коснулась. Её бы выбросили нафиг, далеко и сразу. Попробуйте - её в коде вообще не будет!
под этот мк можно писать исключительно на асме, т.к. си будет искать и пытаться записать всю чухню в озу
Ну, правильно - он (Си) не может по-другому, ну вот такой это язык! Надеюсь, я понятно объяснил почему.
Если Вы хотите придумать "Си только для одного файла и без глобальной инициализации" - пожалуйста, там можно будет соптимизировать, но это уже другой язык будет - не Си.
А про компиляторы Вы зря так - "ничего не изменилось" я тут на форуме выкладывал изумительные результаты оптимизации.
Пора и мне в углу постоять. С моими взглядами.
А что не так, дида?
Ты то это всё знал и без этой темы.
Потому, что это Си - язык такой. И в этом языке глобальную переменную нельзя соптимизировать и выбросить - она обязана иметь своё место в памяти. Иначе в программе может всё сломаться.
Хватит уже нести чушь... еще раз... для тех кто плохо слышит... или не знает...
Всё что не покрыто volatile... на усмотрение оптимизатора...
точка...
Я первый написал, что ничего не поменялось за 20 лет. Человек может соптимизировать лучше любого шаблонного оптимизатора. Ну, если это грамотный человек. Ты пикировку сначала читал?
Потому, что это Си - язык такой. И в этом языке глобальную переменную нельзя соптимизировать и выбросить - она обязана иметь своё место в памяти. Иначе в программе может всё сломаться.
Хватит уже нести чушь... еще раз... для тех кто плохо слышит... или не знает...
Всё что не покрыто volatile... на усмотрение оптимизатора... точка...
А вас тут вапще не стояло, форум не твой.