Как указать комилятору что бы он не оптимизировал

Оптимизация компилятора - это конечно хорошо, но дело в том что иногда он оптимизирует не тоПример:const int a = 10;_asm{      mov eax, dword ptr[a]      mov eax, 11     mov dword ptr[a], eax}function(a);так вот передается 10, а ведь должно 11...Я понимаю что оно не есть хороший подход, но это уже другой вопрос...Идея лиш одна что asm передавать, может можно что-то друголе.. Так вопрос, смысл был веделить память и не использовать(комилятор так делает)  
11 ответов

volatile ?


volatile const int a = 10;
Слово volatile предупреждает компилятор, что переменная может быть изменена со стороны, без участия компилятора.
Так вопрос, смысл был веделить память и не использовать(комилятор так делает)
Не понял вопроса. В ассемблерной вставке обращение идёт к памяти. Без неё никак.


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


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


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


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


Можно и так записать:
const volatile int a = 10;
Это даст понять компилятору, что a - константа, но ее не надо оптимизировать, ведь volatile используется не только потому, что переменная может быть изменена извне, а const нужен не более чем для предотвращения ошибки программиста в коде и не предполагает защиту ячейки памяти от изменения во время выполнения программы.Но это только если автор потом уберет asm вставку, а то смысла в константе нет, если она не константа.


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


т.е. ты исключаешь вероятность того, что компилер/линкер может положить константу в .rdata? 
Да никуда он ее не положит с  volatile...
Наверно просто компилятор с++ не умеет оптимизировать с ассемблерными вставками.
да все он умеет. Для GCC нужно писать _asm_ _ volatile_ ...
Стоп, стоп. Я что-то не понял, а какой смысл объявлять константным то, что потом меняется? Убери const и дело с концом. 
Да, верно. Я так понял это он из вне так хочет принять размер массива... Просто нужно сделать совсем не так тогда...


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


Большинство компилеров имеют для этого (отключение и настройка оптимизации) спецпрагмы и спецопции - смотри доки по своему компилеру.