Чтобы сделать страницу грязной (включая бит грязи в записи таблицы страниц), я касаюсь первых байтов страницы следующим образом:
pageptr[0] = pageptr[0];
Но на практике gcc проигнорирует утверждение об исключении мертвого хранилища. Чтобы предотвратить его оптимизацию в gcc, я переписываю инструкцию следующим образом:
volatile int tmp;
tmp = pageptr[0];
pageptr[0] = tmp;
Вроде уловка работает, но несколько некрасиво. Я хотел бы знать, есть ли какие-либо директивы или синтаксис, которые имеют такой же эффект? И я не хочу использовать -O0
флаг, так как это также сильно снизит производительность.
-O0
не предотвращало «оптимизацию» мертвого кода, например, когда GCC обнаруживает, что какой-то код не имеет никакого эффекта, он просто удаляет его. AFAIK, это этап даже раньше-O0
... Но это только мой опытОтветы:
Отключение оптимизации решает проблему, но в этом нет необходимости. Более безопасная альтернатива - запретить компилятору оптимизировать хранилище с помощью
volatile
квалификатора типа.volatile
Типа Классификатор инструктирует компилятор быть строгим о магазинах памяти и нагрузках. Одна из целейvolatile
- сообщить компилятору, что доступ к памяти имеет побочные эффекты и, следовательно, должен быть сохранен. В этом случае хранилище имеет побочный эффект, вызывая ошибку страницы, и вы хотите, чтобы компилятор сохранил ошибку страницы.Таким образом, окружающий код все еще может быть оптимизирован, и ваш код переносится на другие компиляторы, которые не понимают GCC
#pragma
или__attribute__
синтаксис.источник
volatile
означает, что доступ к памяти должен происходить так, как написано, а это именно то, что мы хотим. Другими словами, мы тщательно об этом думали, и это означает то, что мы думаем.Ты можешь использовать
чтобы отключить оптимизацию, начиная с GCC 4.4.
См. Документацию GCC, если вам нужны дополнительные сведения.
источник
Вместо использования новых прагм вы также можете использовать
__attribute__((optimize("O0")))
для своих нужд. Это имеет то преимущество, что оно применяется только к одной функции, а не ко всем функциям, определенным в одном файле.Пример использования:
источник
-Olevel
опцию, но использовал индивидуальные опции, которые она включает отдельно? (В моем случае я не могу определить, какой из вариантов оптимизации нарушает код) .