Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как указать комилятору что бы он не оптимизировал


Автор: Lycifer 21.7.2008, 13:03
Оптимизация компилятора - это конечно хорошо, но дело в том что иногда он оптимизирует не то
Пример:
const int a = 10;
_asm
{
      mov eax, dword ptr[a]
      mov eax, 11
     mov dword ptr[a], eax
}
function(a);
так вот передается 10, а ведь должно 11...

Я понимаю что оно не есть хороший подход, но это уже другой вопрос...
Идея лиш одна что asm передавать, может можно что-то друголе..
 Так вопрос, смысл был веделить память и не использовать(комилятор так делает) smile 

Автор: SABROG 21.7.2008, 13:32
volatile ?

Автор: 586 21.7.2008, 13:32
Код
volatile const int a = 10;

Слово volatile предупреждает компилятор, что переменная может быть изменена со стороны, без участия компилятора.
Цитата(Lycifer @  21.7.2008,  14:03 Найти цитируемый пост)
Так вопрос, смысл был веделить память и не использовать(комилятор так делает)

Не понял вопроса. В ассемблерной вставке обращение идёт к памяти. Без неё никак.

Автор: Lycifer 21.7.2008, 13:50
Вопрос был в том что бы он не дефайнел константу, то и есть при передале в функцию передаётся значения , при этом значение не берётся из памяти

Автор: SABROG 21.7.2008, 13:55
Цитата(Lycifer @ 21.7.2008,  13:50)
Вопрос был в том что бы он не дефайнел константу, то и есть при передале в функцию передаётся значения , при этом значение не берётся из памяти

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

Автор: JackYF 21.7.2008, 18:02
Цитата(SABROG @  21.7.2008,  12:55 Найти цитируемый пост)
С volatile он будет считывать эту константу

Стоп, стоп. Я что-то не понял, а какой смысл объявлять константным то, что потом меняется? Убери const и дело с концом.

Автор: Любитель 22.7.2008, 13:28
Цитата(JackYF @  21.7.2008,  18:02 Найти цитируемый пост)
Стоп, стоп. Я что-то не понял, а какой смысл объявлять константным то, что потом меняется? Убери const и дело с концом. 

+1

Автор: SABROG 23.7.2008, 17:48
Можно и так записать:

Код

const volatile int a = 10;


Это даст понять компилятору, что a - константа, но ее не надо оптимизировать, ведь volatile используется не только потому, что переменная может быть изменена извне, а const нужен не более чем для предотвращения ошибки программиста в коде и не предполагает защиту ячейки памяти от изменения во время выполнения программы.

Но это только если автор потом уберет asm вставку, а то смысла в константе нет, если она не константа.

Автор: dumb 23.7.2008, 18:35
Цитата(SABROG @  23.7.2008,  18:48 Найти цитируемый пост)
а const нужен не более чем для предотвращения ошибки программиста в коде и не предполагает защиту ячейки памяти от изменения во время выполнения программы.

т.е. ты исключаешь вероятность того, что компилер/линкер может положить константу в .rdata?

Автор: DRUID3 23.7.2008, 18:49
Цитата(dumb @  23.7.2008,  17:35 Найти цитируемый пост)
т.е. ты исключаешь вероятность того, что компилер/линкер может положить константу в .rdata? 

Да никуда он ее не положит с  volatile...

Цитата(SABROG @  21.7.2008,  12:55 Найти цитируемый пост)
Наверно просто компилятор с++ не умеет оптимизировать с ассемблерными вставками.

да все он умеет. Для GCC нужно писать _asm_ _ volatile_ ...

Цитата(JackYF @  21.7.2008,  17:02 Найти цитируемый пост)
Стоп, стоп. Я что-то не понял, а какой смысл объявлять константным то, что потом меняется? Убери const и дело с концом. 

Да, верно. Я так понял это он из вне так хочет принять размер массива... Просто нужно сделать совсем не так тогда...

Автор: Lycifer 24.7.2008, 12:35
На счет volatile - const полечит, ну вот что делать в других случаях остаётся вопрос(ТО и есть я думаю бывают и другие случаи когда компилятор оптимизирует ну а делать это не надо, const это просто пример)

Автор: Любитель 24.7.2008, 12:59
Большинство компилеров имеют для этого (отключение и настройка оптимизации) спецпрагмы и спецопции - смотри доки по своему компилеру.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)