Насколько переносимым является код, который использует #pragma optimize
? Поддерживает ли это большинство компиляторов и насколько полная поддержка для этого #pragma
?
#pragma
это санкционированный и портативный способ для компиляторов, чтобы добавить несанкционированный и непереносимый языковые расширения *.
По сути, вы никогда не знаете наверняка, и по крайней мере один основной компилятор C ++ (g ++) не поддерживает эту прагму как есть.
*:
Из стандарта C ++ (N3242):
16.6 Прагма директива [Cpp.pragma]
Директива предварительной обработки вида
# pragma
PP-маркерывыбирать новая линиязаставляет реализацию вести себя в зависимости от реализации. Такое поведение может привести к сбою перевода или к тому, что транслятор или получающаяся программа будут вести себя не соответствующим образом. Любая прагма, которая не распознается реализацией, игнорируется.
Из стандарта С (проект комитета — 12 апреля 2011 г.):
6.10.6 Прагма директива
Семантика
Директива предварительной обработки вида
# pragma
PP-маркерывыбирать новая линиягде токен предварительной обработки
STDC
не сразу следуетpragma
в
директива (до любой замены макроса)174) заставляет реализацию вести себя в
определяемый реализацией способ. Такое поведение может привести к сбою перевода или вызвать
переводчик или результирующая программа ведут себя несоответствующим образом. Любое такое
pragma
то, что не распознается реализацией, игнорируется.
И вот пример:
int main () {
#pragma omp parallel for
for (int i=0; i<16; ++i) {}
}
Большая часть OpenMP API C и C ++ реализована в виде #pragma
s.
Часто не стоит полагаться на флаги компилятора, поскольку каждый компилятор имеет свое собственное поведение.
Этот флаг не должен использоваться, так как это спецификация уровня компиляции, которую вы вводите в код.
Обычно и теоретически этот флаг должен игнорироваться компилятором, если он не используется.
#pragma
Ключевое слово является переносимым в том смысле, что оно всегда должно компилироваться, несмотря на компилятор. Однако, прагмы зависят от компилятора, поэтому вероятно, что при изменении компилятора он будет жаловаться с некоторыми предупреждениями. Некоторые прагмы широко используются, например, из OpenMP. Чтобы сделать код максимально переносимым, вы можете окружить свои прагмы #ifdef
/#endif
это зависит от компилятора, который вы используете. Например:
#ifdef __ICC
#pragma optimize
#endif
Компиляторы обычно определяют некоторые макросы, такие как __ICC
которые делают код знать, какой компилятор используется.
Любое использование #pragma
зависит от компилятора.
Например :
GNU, Intel и IBM:
#warning "Do not use ABC, which is deprecated. Use XYZ instead."
Microsoft:
#pragma message("Do not use ABC, which is deprecated. Use XYZ instead.")
Что касается вашего конкретного вопроса о #pragma optimize
, поддерживается НКУ а также Microsoft, но это не значит, что это будет в будущем.
#pragma
не переносимый, полная остановка Была версия gcc, которая использовалась для запуска игры всякий раз, когда она сталкивалась с
Два компилятора, которые мы используем на работе, определенно не поддерживают #pragma optimise
и я не могу отвечать за остальных.
И даже если бы они это сделали, так как параметры командной строки для оптимизации различны, есть вероятность, что параметры прагмы будут другими.