2015-01-23 2 views
2

Насколько я знаю, если два указателя (или ссылки) не набирают псевдонимы друг друга, для компилятора является законным делать предположение, что они адресуют разные местоположения и делают определенные оптимизации, например инструкции по переупорядочению. Следовательно, наличие указателей на разные типы с одинаковым значением может быть проблематичным. Однако, я думаю, эта проблема применима только тогда, когда два указателя передаются в функции. Внутри тела функции, в которой создаются два указателя, компилятор должен иметь возможность убедиться в том, что отношения между ними касаются того, адресуются ли они одному и тому же месту. Я прав?Существует ли проблема с псевдонимом типа, когда указатели передаются в функции как аргументы?

+0

Umm ... Если вы передадите указатель на структуру и указатель на первый член этой структуры, эти указатели будут по существу псевдонимом, хотя они являются указателями на разные типы ... – twalberg

ответ

3

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

Исправить. GCC, например, выполняет оптимизацию этой формы, которую можно отключить, передав флаг -fno-strict-aliasing.

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

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

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