Насколько переносимым является код с оптимизацией #pragma?

Насколько переносимым является код, который использует #pragma optimize? Поддерживает ли это большинство компиляторов и насколько полная поддержка для этого #pragma?

5

Решение

#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 ++ реализована в виде #pragmas.

11

Другие решения

Часто не стоит полагаться на флаги компилятора, поскольку каждый компилятор имеет свое собственное поведение.

Этот флаг не должен использоваться, так как это спецификация уровня компиляции, которую вы вводите в код.

Обычно и теоретически этот флаг должен игнорироваться компилятором, если он не используется.

6

#pragma Ключевое слово является переносимым в том смысле, что оно всегда должно компилироваться, несмотря на компилятор. Однако, прагмы зависят от компилятора, поэтому вероятно, что при изменении компилятора он будет жаловаться с некоторыми предупреждениями. Некоторые прагмы широко используются, например, из OpenMP. Чтобы сделать код максимально переносимым, вы можете окружить свои прагмы #ifdef/#endif это зависит от компилятора, который вы используете. Например:

#ifdef __ICC
#pragma optimize
#endif

Компиляторы обычно определяют некоторые макросы, такие как __ICC которые делают код знать, какой компилятор используется.

3

Любое использование #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, но это не значит, что это будет в будущем.

1

#pragma не переносимый, полная остановка Была версия gcc, которая использовалась для запуска игры всякий раз, когда она сталкивалась с

Два компилятора, которые мы используем на работе, определенно не поддерживают #pragma optimiseи я не могу отвечать за остальных.

И даже если бы они это сделали, так как параметры командной строки для оптимизации различны, есть вероятность, что параметры прагмы будут другими.

1
По вопросам рекламы [email protected]