2009-04-07 6 views
2

'Strict aliasing' Оптимизация требует особого ухода от исходного кода, s.a. используя объединение вместо указателей. Есть ли способ обнаружить с помощью препроцессорных директив (# if/else), пытается ли компилятор сделать такую ​​оптимизацию?Как определить «строгий псевдоним» во время компиляции?

Я хотел бы сохранить старый и не строгий сглаженный код кода для процессоров и компиляторов, которые не заботятся. Это кажется быстрее.

Редактировать: GCC predefined macros, похоже, ничего не имеет о псевдониме. Другими словами, меня больше всего интересует gcc 4.x, но и в общем решении (которое, похоже, не существует).

ответ

3

Полностью зависит от реализации - вам необходимо проверить документы для вашего конкретного компилятора (ов). И когда вы задаете такие вопросы, рекомендуется указать, какой компилятор (ы) вы используете.

Полупансионный способ сделать это из вашего файла Makefile - определить разные цели для псевдонимов & unaliased версий и определить собственный символ препроцессора STRICT_ALIASING (или любой другой) для псевдонимов.

1

Там нет общего решения. Ближайшим является #ifdef __cplusplus, поскольку стандарт C++ позволяет компилятору предполагать, что указатели на разные типы не сглажены (если только они не являются char *). Это происходит даже в простых сценариях:

void (int *foo, float *bar) { 
    *foo++; 
    *bar = 0; // Can safely be scheduled between the load and store of foo. 
} 

Поэтому «строгое наложение псевдонимов» на самом деле не является оптимальным; «терпимость к неопределенному поведению» - это пессимизация.

+2

Это неправильно. Оба C и C++ допускают сглаживание между переменными того же типа, но ни C, ни C++ не разрешают сглаживание разных типов (т. Е. Оптимизация строгих псевдонимов в GCC). – janneb

+0

.. за исключением char, конечно – janneb

1

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

Если вы используете «-Wall» gcc, тогда компилятор предупредит вас о коде, который может нарушить правило строгого сглаживания.

-Wstrict-aliasing --- Эта опция активна только когда «-fstrict ступенчатость» является активными. Он предупреждает о коде, который может нарушить строгие правила псевдонимов , которые компилятор использует для оптимизации . Предупреждение не уловить все случаи, но делает попытку поймать более распространенные ловушки. Это включено в '-Wall'. Это эквивалентно к «-Wstrict сглаживанием = 3»

Если код вы работаете на очень важно, то вы можете отключить -fstring-aliasing в НКУ. Или, если вы не хотите отключать строгий псевдоним, я предлагаю посмотреть выход asm, чтобы убедиться, что компилятор не делает опасных оптимизаций, которые вам не нужны.


Как и в стороне, akauppi сказал в комментариях:

'ограничение' включает строгий Aliasing оптимизированные для конкретных указателей.

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

хорошее объяснение Ограничить ключевое слово из TI's DSP compiler documentation:.

Чтобы помочь компилятору определить зависимости от памяти, вы можете квалифицировать указатель, ссылку или массив с ключевым словом ограничения. Ключевое слово ограничения - это тип классификатора, который может применяться к указателям, ссылкам и массивам. Его использование представляет собой гарантию программиста, которая в рамках указателя декларация, на которую указывает объект, может быть это только указатель. Любое Нарушение этой гарантии делает программу неопределенной. Эта практика помогает компилятор оптимизирует определенные разделы кода, потому что информация о сглаживании может быть более легко определена.

+0

Извините, вы ошибаетесь. «ограничивать» позволяет оптимизировать строгие псевдонимы для определенных указателей. Я спросил, как определить, будет ли эта оптимизация глобально автоматически применяться к указателям _all_. Извините, -1. – akauppi

Смежные вопросы