Chr*_*s_F 51 c++ clang compiler-optimization
代码的目的是找到32位浮点位模式的总数,它代表0到1之间的值.在我看来这应该可行,但由于某种原因,Clang的汇编输出基本上相当于return 0;.
我使用-std=c++1y -Wall -Wextra -pedantic -O2和编译了Clang 3.3和Clang 3.4.1-std=c++1y -Wall -Wextra -pedantic -O3
Clang 3.4使用-O2和-O3优化一切.
Clang 3.3仅使用-O3优化一切.
通过"优化一切",我的意思是这是程序的汇编输出:
main: # @main
xorl %eax, %eax
ret
Run Code Online (Sandbox Code Playgroud)
#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;
}
Run Code Online (Sandbox Code Playgroud)
muk*_*nda 61
这是一个更简单的测试用例,指出它是一个编译器错误:
http://coliru.stacked-crooked.com/a/58b3f9b4edd8e373
#include <cstdint>
int main()
{
uint32_t i = 0;
uint32_t count = 1;
while (1)
{
if( i < 5 )
count+=1;
if (i == 0xFFFFFFFF)
break;
i++;
}
return count; // should return 6
}
Run Code Online (Sandbox Code Playgroud)
程序集显示它输出1而不是6.它不认为它是无限循环,在这种情况下程序集不会从main返回.
| 归档时间: |
|
| 查看次数: |
3618 次 |
| 最近记录: |