Цель кода - найти общее количество 32-битных битовых шаблонов с плавающей запятой, которые представляют значения от 0 до 1. Мне кажется, что это должно сработать, но почему-то сборка, выводимая из Clang, в основном эквивалент return 0;
.
Я скомпилировал это с помощью Clang 3.3 и Clang 3.4.1, используя -std=c++1y -Wall -Wextra -pedantic -O2
и -std=c++1y -Wall -Wextra -pedantic -O3
Clang 3.4 оптимизирует все с помощью -O2 и -O3.
Clang 3.3 только оптимизирует все с помощью -O3.
Под "оптимизирует все" я подразумеваю, что это сборка выхода программы:
main: # @main
xorl %eax, %eax
ret
#include <limits>
#include <cstring>
#include <cstdint>
template <class TO, class FROM>
inline TO punning_cast(const FROM &input)
{
TO out;
std::memcpy(&out, &input, sizeof(TO));
return out;
}
int main()
{
uint32_t i = std::numeric_limits<uint32_t>::min();
uint32_t count = 0;
while (1)
{
float n = punning_cast<float>(i);
if(n >= 0.0f && n <= 1.0f)
count++;
if (i == std::numeric_limits<uint32_t>::max())
break;
i++;
}
return count;
}