Если я составляю следующий код с Clang 3.3, используя -O3 -fno -vectorize , я получаю тот же вывод сборки, даже если я удаляю закомментированную строку. Тип кода калает все возможные 32-разрядные целые числа, чтобы плавать и считает те, которые в диапазоне [0, 1]. Является ли оптимизатор Clang на самом деле достаточно умным, чтобы понять, что 0xffffffff, когда Pan Panled Float не находится в диапазоне [0, 1], так что игнорируйте второй вызов fn полностью? GCC создает другой код, когда второй вызов удаляется.
Код: Выделить всё
#include
#include
#include
template
inline TO punning_cast(const FROM &input)
{
TO out;
std::memcpy(&out, &input, sizeof(TO));
return out;
}
int main()
{
uint32_t count = 0;
auto fn = [&count] (uint32_t x) {
float f = punning_cast(x);
if (f >= 0.0f && f
Подробнее здесь: [url]https://stackoverflow.com/questions/23926075/is-clang-really-this-smart[/url]