Arlleex 178 5 декабря, 2018 Опубликовано 5 декабря, 2018 · Жалоба Только что, inventor сказал: работает с оптимизацией без volatile если asm Закоментить не работает А Вы не находите, что наличие asm("nop") изменяет предположение компилятора о ненадобности пустого цикла при оптимизации в обратную сторону? Оптимизатор выкидывает бесполезные действия. И одним из таких действий как раз является бесконечный цикл с пустым телом. Вопрос, почему оно с непустым телом работает - тоже вопрос (хорошо проверяли? тесты достоверны, либо просто так совпало?), по-хорошему компилятор вправе закинуть тухлыми помидорами и этот код, превратив его в то, что я описал в предыдущем посте. Смотреть нужно сгенерированный ассемблер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 5 декабря, 2018 Опубликовано 5 декабря, 2018 · Жалоба 3 minutes ago, Arlleex said: А Вы не находите, что наличие asm("nop") изменяет предположение компилятора о ненадобности пустого цикла при оптимизации в обратную сторону? Оптимизатор выкидывает бесполезные действия. И одним из таких действий как раз является бесконечный цикл с пустым телом. то есть по мнению оптимизатора - действия с переменной - это бесполезные действия, который можно выкинуть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 5 декабря, 2018 Опубликовано 5 декабря, 2018 · Жалоба 18 минут назад, inventor сказал: в чем правильное? Ну так если "неправильное" - напишите свой компилятор, "правильный". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 5 декабря, 2018 Опубликовано 5 декабря, 2018 (изменено) · Жалоба Только что, inventor сказал: то есть по мнению оптимизатора - действия с переменной - это бесполезные действия, который можно выкинуть. В данном случае - да. Вы логически подумайте - зачем вообще нужен цикл, который ничего не делает? Задержки программные делать? Тогда я могу только посоветовать отходить от ардуино-стиля, где принято лепить задержки на пустых тактах процессора Изменено 5 декабря, 2018 пользователем Arlleex Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 5 декабря, 2018 Опубликовано 5 декабря, 2018 · Жалоба 2 minutes ago, Arlleex said: В данном случае - да. Вы логически подумайте - зачем вообще нужен цикл, который ничего не делает? Задержки программные делать? Тогда я могу только посоветовать отходить от ардуино-стиля, где принято лепить задержки на пустых тактах процессора ну зачем то он стоит, может сам оптимизатор должен не так работать, почему я должен предугадывать как поведет себя в какой то ситуации может опцию предусмотреть ну типа #optimize_that ... какой то код #end_optimize а все что не оформлено такими рамками-не трогать в этом случае это было бы правильнее поведение я так думаю Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 5 декабря, 2018 Опубликовано 5 декабря, 2018 (изменено) · Жалоба Только что, inventor сказал: ну зачем то он стоит Чтобы индус, который писал этот код, смог побыстрее получить гонорар за набитые строки кода и уйти домой пораньше. Не более. Только что, inventor сказал: может сам оптимизатор должен не так работать почему я должен предугадывать как поведет себя в какой то ситуации Оптимизатор работает правильно. Вы как раз не должны предугадывать его поведение. С корректным кодом результат работы что с оптимизацией, что без нее, отличаться не будет в плане логики. А, как было уже сказано, если программа перестает работать правильно при включении оптимизации - проблема в программе, и это очень хорошо, что эта проблема проявилась. Только что, inventor сказал: #optimize_that ... какой то код #end_optimize Сделайте раздельную компиляцию проекта. И каждый файл компилируйте с соответствующими опциями. Но, ИМХО, возможности оптимизатора значительно сократятся, поскольку оптимизация проводится не только на уровне исходного файла, насколько я знаю, но также на уровне компоновки. http://www.keil.com/support/docs/3704.htm Изменено 5 декабря, 2018 пользователем Arlleex Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 5 декабря, 2018 Опубликовано 5 декабря, 2018 · Жалоба 30 minutes ago, Arlleex said: Чтобы индус, который писал этот код, смог побыстрее получить гонорар за набитые строки кода и уйти домой пораньше. Не более. Оптимизатор работает правильно. Вы как раз не должны предугадывать его поведение. С корректным кодом результат работы что с оптимизацией, что без нее, отличаться не будет в плане логики. А, как было уже сказано, если программа перестает работать правильно при включении оптимизации - проблема в программе, и это очень хорошо, что эта проблема проявилась. Сделайте раздельную компиляцию проекта. И каждый файл компилируйте с соответствующими опциями. Но, ИМХО, возможности оптимизатора значительно сократятся, поскольку оптимизация проводится не только на уровне исходного файла, насколько я знаю, но также на уровне компоновки. http://www.keil.com/support/docs/3704.htm в иаре #pragma optimize=none жаль нету #pragma push и #pragma pop Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 136 5 декабря, 2018 Опубликовано 5 декабря, 2018 · Жалоба 1 час назад, inventor сказал: то есть по мнению оптимизатора - действия с переменной - это бесполезные действия, который можно выкинуть. Именно так. Потому что согласно Стандарту языка определяющим является "наблюдаемое поведение". Понятия "затраченое время" в наблюдаемое поведение, согласно Стандарту, не входит. Если единственным выхлопом вашего кода является потраченное впустую время (та самая "большая и медленная программа") - ваш код, согласно Стандарту, бесполезен. Если вам необходимо потратить время - есть ключевое слово volatile. Если вам не нравится Стандарт - жалуйтесь в Лигу Сексуальных Реформ или используйте более другой язык. Если вы не хотите изучать язык - это ваше право, но вины языка или Стандарта в этом нет. Не вижу смысла что-то еще доказывать. Ваш asm() по логике обладает свойствами volatile - компилятор обязан выполнить его указанное в условии цикла количество раз, поэтому не может выкинуть и цикл. Копаться внутри вашего ассемблерного текста и понимать, что там тоже ничего полезного нет - не его задача. 48 минут назад, inventor сказал: жаль нету #pragma push и #pragma pop Что, уже нету? Лет 10 назад были. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 5 декабря, 2018 Опубликовано 5 декабря, 2018 · Жалоба __nop() никогда не выбрасывается компилятором Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 5 декабря, 2018 Опубликовано 5 декабря, 2018 · Жалоба 56 minutes ago, Сергей Борщ said: Потому что согласно Стандарту языка определяющим является "наблюдаемое поведение" Стандарт подходит к объяснению того, что компилятор должен сохранять наблюдаемое поведение при выполнении оптимизации. http://qaru.site/questions/2132338/does-c99-standard-define-observable-behavior-as-c03-does Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 136 5 декабря, 2018 Опубликовано 5 декабря, 2018 · Жалоба 30 минут назад, inventor сказал: Стандарт подходит к объяснению того, что компилятор должен сохранять наблюдаемое поведение при выполнении оптимизации. Насчет подхода не понял, но что именно в наблюдаемом поведении вашей программы меняется? Ваш цикл на наблюдаемое поведение не влияет в обоих случаях. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 5 декабря, 2018 Опубликовано 5 декабря, 2018 · Жалоба 9 minutes ago, Сергей Борщ said: Насчет подхода не понял, но что именно в наблюдаемом поведении вашей программы меняется? Ваш цикл на наблюдаемое поведение не влияет в обоих случаях. если предположим функция будет давать на выходе разный результат при исползовании оптимизаора и не то и наблюдаемое поведение будет разным разве не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 136 5 декабря, 2018 Опубликовано 5 декабря, 2018 · Жалоба 32 минуты назад, inventor сказал: если предположим функция будет давать на выходе разный результат при исползовании оптимизаора и не то и наблюдаемое поведение будет разным разве не так? Да. Но ваша функция результата не выдает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 5 декабря, 2018 Опубликовано 5 декабря, 2018 · Жалоба 3 часа назад, jcxz сказал: Ну так если "неправильное" - напишите свой компилятор, "правильный". Я думаю тут стоит начать с "правильного" языка. А С/С++ явно "неправильный" т.к. делает не то о чем "программист" подумал, но не записал в исходнике. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 5 декабря, 2018 Опубликовано 5 декабря, 2018 · Жалоба 4 minutes ago, Сергей Борщ said: Да. Но ваша функция результата не выдает. почему же, если при оптимизации пишешь local_time как volatile - то она работает как задержка а если нет-то не работает разный результат Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться