2010-08-19 4 views
2

У меня есть исследование влияния __restricting некоторых указателей на C++-код при компиляции с помощью GCC-компилятора.Учитывается ли компилятор GCC C++ __restrict - утверждения?

Оказалось, что не только время выполнения остается таким же, но исполняемый файл, похоже, не изменился, размер в байтах точно такой же, как и раньше.

Мой GCC-версия

gcc version 4.3.2 [gcc-4_3-branch revision 141291] (SUSE Linux) 

и хотя он принимает это C++ - расширение при разборе, он, кажется, не рассматривать его при сборке кода. Таким образом, есть либо причина, что компилятор не знает, как использовать эту семантическую информацию, либо обработка этой информации полностью отключена.

Код выполняет множество операций хруста, поэтому он должен быть включен для целей тестирования. Вы можете помочь?

+0

Без кода очень сложно что-либо сказать. Вполне возможно, что с тем, как написан код, ключевое слово '__restrict' ничего не покупает. Есть случаи (предполагается, что два указателя, указывающие на разные типы, никогда не указывают на одну и ту же память, если только один из них не является символом 'char *'), в котором он так или иначе принимается. – Omnifarious

+0

Ключевое слово 'restrict' имеет очень специфический эффект для сгенерированной сборки. Вы должны использовать 'objdump' или' gcc -S', чтобы посмотреть на сборку, которую он генерирует, чтобы увидеть, что это за эффект. Размер вашего исполняемого файла и времени выполнения являются плохими критериями его эффекта. – greyfade

+0

Вопрос еще не в том, помогает ли знание нескольких массивов, которые не пересекаются, для какой-либо помощи для компилятора, поскольку исполняемые файлы полностью совпадают с байтом для байта. Поэтому я думаю, что функция отключена в самом компиляторе. – shuhalo

ответ

7

restrict квалификаторы - это в основном способ помочь компилятору выполнить определенные оптимизации, связанные с псевдонимом. Они будут иметь эффект только в том случае, если эти возможности оптимизации уже присутствуют в коде, поэтому использование restrict просто позволяет им в ситуациях, когда компилятору ранее приходилось использовать «безопасное» (не оптимизирующее) генерирование кода. В других контекстах restrict не будет иметь никакого эффекта.

Итак, вы добавили в код код restrict. Но был ли кто-либо из них использован в контексте, где они на самом деле имеют значение, т. Е. Где они фактически дают компилятору больше свободы для оптимизации кода? Если нет, вы не должны ожидать, что ваш код изменится.

+0

Я использовал его для нескольких функций, которые собирают матрицу и решают линейную систему. Эти процессы обрабатывают несколько массивов, которые представляют узловые величины и параметры и обрабатывают их в огромном цикле. Поэтому я думаю, эта информация может быть полезной для оптимизатора. – shuhalo