关于 __builtin_xxx 系列函数的坑
  • 板块学术版
  • 楼主CDFLS_mao_zx
  • 当前回复7
  • 已保存回复7
  • 发布时间2023/3/10 16:37
  • 上次更新2023/10/23 22:02:03
查看原帖
关于 __builtin_xxx 系列函数的坑
177535
CDFLS_mao_zx楼主2023/3/10 16:37

__builtin_clz,__builtin_ctz 以及 __builtin_clzll,__builtin_ctzll x=0x=0 时均无定义。

另外需要注意,编译器会优化掉字面量,例如

cin>>x;
cout<<__builtin_clz(0)<<endl;
cout<<__builtin_clz(x)<<endl;

当输入为 00 时两行的输出不同(无论是否 O2)。

无定义函数的返回值视计算机硬件,编译器版本,操作系统甚至是计算机此时的物理温度会有不同,所以用的时候最好特判一下,有可能本地计算机心情比较好能让你过拍。

可以用以下代码测试:

#include<bits/stdc++.h>
signed main()
{
    int x;
    std::cin>>x;
    std::cout<<__builtin_clzll(0)<<'\n';
    std::cout<<__builtin_ctzll(0)<<'\n';

    std::cout<<__builtin_clz(0)<<'\n';
    std::cout<<__builtin_ctz(0)<<'\n';

    std::cout<<__builtin_clzll(x)<<'\n';
    std::cout<<__builtin_ctzll(x)<<'\n';

    std::cout<<__builtin_clz(x)<<'\n';
    std::cout<<__builtin_ctz(x)<<'\n';
}

如果你不相信它和计算机此时的物理温度有关,你可以多试几遍,每次尝试的时候可以多打开一个占内存较大的应用比如说 Visual Studio。

模拟挂大分的警告。

__builtin_popcountx=0x=0 时有定义。

2023/3/10 16:37
加载中...