Один из первых результатов для строгого сглаживания на google - это статья
http://dbp-consulting.com/tutorials/StrictAliasing.html
Интересно, что я заметил следующее: http://goo.gl/lPtIa5
uint32_t swaphalves(uint32_t a) {
uint32_t acopy = a;
uint16_t* ptr = (uint16_t*)&acopy;
uint16_t tmp = ptr[0];
ptr[0] = ptr[1];
ptr[1] = tmp;
return acopy;
}
скомпилирован в
swaphalves(unsigned int):
mov eax, edi
ret
по GCC 4.4.7. Любой компилятор, более новый, чем это (4.4 упоминается в статье, поэтому статья не ошибается) не реализует функцию, поскольку она может использовать строгий псевдоним. Что является причиной этого? Было ли это ошибкой в GCC или GCC, решил отказаться от нее, так как многие строки кода были написаны так, что они производят UB или это просто регрессия компилятора, которая длится годами... Также Кланг не оптимизирует его.