В качестве примера рассмотрим следующий фрагмент:
*pInt = 0xFFFF;
*pFloat = 5.0;
Поскольку они являются указателями int
и float
, компилятор предположит, что они не являются псевдонимами и могут их обменять, например.
Теперь предположим, что мы придаем этому следующее:
*pInt = 0xFFFF;
*pChar = 'X';
*pFloat = 5.0;
Так как char*
разрешено псевдоним что-либо, он может указывать на *pInt
, поэтому присвоение *pInt
не может быть перемещено за пределы назначения *pChar
, поскольку оно может на законных основаниях указывать на *pInt
и устанавливать его первый байт на "X".
Точно так же pChar
может указывать на *pFloat
, назначение *pFloat
не может быть перенесено перед назначением char, потому что код может намереваться свести на нет эффекты предыдущей настройки байта, переназначив *pFloat
.
Означает ли это, что я могу писать и читать через char*
для создания барьеров для перегруппировки и других оптимизаций, связанных с строгим псевдонимом?