代码的目的是查找表示0到1之间的值的32位浮点位模式的总数。看起来这应该有效,但由于某种原因,来自Clang的汇编输出基本等同于
我使用
Clang 3.4使用-O2和-O3优化掉了所有内容。
Clang 3.3仅使用-O3优化掉了所有内容。
“优化掉所有内容”指的是程序的汇编输出:
return 0;
。我使用
-std=c++1y -Wall -Wextra -pedantic -O2
和-std=c++1y -Wall -Wextra -pedantic -O3
对Clang 3.3和Clang 3.4.1进行了编译。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;
}
std::next_after
呢?(但是因为你在开始编写代码之前就明确了你的目标,所以我给你点赞。) - Kerrek SB-fsanitize = undefined
,clang也没有报告任何问题。像这样使用memcpy
不违反别名规则。 - user743382