| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 передавать, может можно что-то друголе.. Так вопрос, смысл был веделить память и не использовать(комилятор так делает) |
| Автор: SABROG 21.7.2008, 13:32 |
| volatile ? |
| Автор: Lycifer 21.7.2008, 13:50 |
| Вопрос был в том что бы он не дефайнел константу, то и есть при передале в функцию передаётся значения , при этом значение не берётся из памяти |
| Автор: SABROG 21.7.2008, 13:55 | ||
Наверно просто компилятор с++ не умеет оптимизировать с ассемблерными вставками. Для него константа не меняется поэтому он и пихает ее напрямую. С volatile он будет считывать эту константу каждый раз из памяти, а не использовать непосредственное значение. |
| Автор: JackYF 21.7.2008, 18:02 |
Стоп, стоп. Я что-то не понял, а какой смысл объявлять константным то, что потом меняется? Убери const и дело с концом. |
| Автор: Любитель 22.7.2008, 13:28 | ||
+1 |
| Автор: SABROG 23.7.2008, 17:48 | ||
Можно и так записать:
Это даст понять компилятору, что a - константа, но ее не надо оптимизировать, ведь volatile используется не только потому, что переменная может быть изменена извне, а const нужен не более чем для предотвращения ошибки программиста в коде и не предполагает защиту ячейки памяти от изменения во время выполнения программы. Но это только если автор потом уберет asm вставку, а то смысла в константе нет, если она не константа. |
| Автор: dumb 23.7.2008, 18:35 | ||
т.е. ты исключаешь вероятность того, что компилер/линкер может положить константу в .rdata? |
| Автор: DRUID3 23.7.2008, 18:49 | ||||||
Да никуда он ее не положит с volatile...
да все он умеет. Для GCC нужно писать _asm_ _ volatile_ ...
Да, верно. Я так понял это он из вне так хочет принять размер массива... Просто нужно сделать совсем не так тогда... |
| Автор: Lycifer 24.7.2008, 12:35 |
| На счет volatile - const полечит, ну вот что делать в других случаях остаётся вопрос(ТО и есть я думаю бывают и другие случаи когда компилятор оптимизирует ну а делать это не надо, const это просто пример) |
| Автор: Любитель 24.7.2008, 12:59 |
| Большинство компилеров имеют для этого (отключение и настройка оптимизации) спецпрагмы и спецопции - смотри доки по своему компилеру. |