gcc __builtin_xxx __attribute__((xxx))

2024-01-12 07:20
文章标签 xxx attribute gcc builtin

本文主要是介绍gcc __builtin_xxx __attribute__((xxx)),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

__builtin_clz 是 GCC 和 Clang 编译器提供的一个内置函数,用于计算一个整数的二进制表示中,从最高位开始连续的 0 的个数

__builtin_ctz,返回从最低位开始的连续的 0 的个数;如果传入 0 则行为未定义。

_BitScanForward ,Visual Studio 中的内建函数,等价于 GCC 的 __builtin_ctz

__builtin_clz 的内部原理是使用CPU的指令集来实现计算。具体来说,当 CPU 支持 CLZ 指令时,__builtin_clz 会使用 CLZ 指令来计算从最高位开始连续的 0 的个数;否则,__builtin_clz 会使用一些位运算技巧来实现计算。在实现中,__builtin_clz 会根据不同的CPU架构和编译器选项来选择最优的实现方式,从而提高计算效率。
__builtin_ctz 的内部原理是使用 CPU 的指令集来实现计算。具体来说,当 CPU支 持 CTZ 指令时,__builtin_ctz 会使用 CTZ 指令来计算从最低位开始连续的0的个数;否则,__builtin_ctz 会使用一些位运算技巧来实现计算。

__builtin_clzll 与 __builtin_ctzll则是 64 位对应的实现版本。

 综上所述: 32位机器和64位机器比较,对于long和unsigned long类型,所占用的空间是不一样的,从代码可移植性考虑,定义变量最好明确所需长度,选用合适的变量类型。

GCC 部分内建位运算函数轮子 - 克莉丝随笔 (xr1s.me)

造个轮子:

/* 优化分支代码编译 */
#define likely(x)			__builtin_expect(!!(x), 1)
#define unlikely(x)			__builtin_expect(!!(x), 0)#ifndef ctz
/* 最低为 0 的个数,如果传入 0,结果未知。 */
#define ctz(v)				__builtin_ctz(v)
#endifstatic inline u32 ctz64(u64 v)
{u32 *_v = (u32 *)&v;if (_v[0])return ctz(_v[0]);elsereturn ctz(_v[1]) + 32;
}/*! @brief take ceilling of x divided by r */
#define occupied_by(x, r)		(((x) + (r) - 1) / (r))
/*! @brief round up x by 2 to the power of r */
#define round_up_by_2_power(x, r)	(((x) + (r) - 1) & (~((r) - 1)))

__bulitin_popcount     一共有三个函数,分别适用于不同的输入类型。

    int __builtin_popcount (unsigned int x)Returns the number of 1-bits in x.int __builtin_popcountl (unsigned long)Similar to __builtin_popcount, except the argument type is unsigned long.int __builtin_popcountll (unsigned long long)Similar to __builtin_popcount, except the argument type is unsigned long long.

返回输入的二进制表示中1的个数;如果传入0则返回 0 。三个不同的函数分别用于unsigned int,unsigned long以及unsigned long long。

__bulitin_parity    一共有三个函数,分别适用于不同的输入类型。

    int __builtin_parity (unsigned int x)Returns the parity of x, i.e. the number of 1-bits in x modulo 2.int __builtin_parityl (unsigned long)Similar to __builtin_parity, except the argument type is unsigned long.int __builtin_parityll (unsigned long long)

返回输入的二进制表示中 1 的个数的奇偶,也就是输入的二进制中1的个数对2取模的结果。三个不同的函数分别用于unsigned int,unsigned long 以及 unsigned long long。

这篇关于gcc __builtin_xxx __attribute__((xxx))的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/597163

相关文章

【Python报错已解决】AttributeError: ‘list‘ object has no attribute ‘text‘

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查属性名2.2 步骤二:访问列表元素的属性 三、其他解决方法四、总结 前言 在Python编程中,属性错误(At

bash: arm-linux-gcc: No such file or directory

ubuntu出故障重装了系统,一直用着的gcc使用不了,提示bash: arm-linux-gcc: No such file or directorywhich找到的命令所在的目录 在google上翻了一阵发现此类问题的帖子不多,后来在Freescale的的LTIB环境配置文档中发现有这么一段:     # Packages required for 64-bit Ubuntu

编译linux内核出现 arm-eabi-gcc: error: : No such file or directory

external/e2fsprogs/lib/ext2fs/tdb.c:673:29: warning: comparison between : In function 'max2165_set_params': -。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。 。。。。。。。。 host asm: libdvm <= dalvik/vm/mterp/out/Inte

【linux学习指南】Linux编译器 gcc和g++使用

文章目录 📝前言🌠 gcc如何完成🌉预处理(进行宏替换) 🌠编译(生成汇编)🌉汇编(生成机器可识别代码) 🌠链接(生成可执行文件或库文件)🌉函数库 🌠gcc选项🚩总结 📝前言 预处理(进行宏替换)编译(生成汇编)汇编(生成机器可识别代码)连接(生成可执行文件或库文件) 🌠 gcc如何完成 格式 :gcc [选项] 要编译的文件 [选项] [目标文

gcc编译常见问题

inux C gcc -lm     使用 math.h中声明的库函数还有一点特殊之处,gcc命令行必须加-lm选项 ,因为数学函数位于 libm.so 库文件中(这些库文件通常位于/lib目录下),-lm选项告诉编译器,我们程序中用到的数学函数要到这个库文件里找。本书用到的大部分库函数(例如printf)位于 libc.so 库文件中,使用libc.so中的库函数在编译时不需要加-l

C++入门(05-2)从命令行执行C++编译器_GCC

文章目录 GCC编译器1. 下载MinGW-w64,安装(不推荐)2. 使用MSYS2安装MinGW-w64(推荐)2.1 安装MSYS22.2 初始化和更新2.3 安装MinGW-w64编译器2.3 在MSYS2 Shell中导航到代码目录2.4 使用 g++ 编译2.5 运行可执行文件 GCC编译器 GCC(GNU Compiler Collection)是一个开源编译器集

gcc 编译器对 sqrt 未定义的引用

man sqrt  Link with -lm. gcc -o test test.c -lm 原因:缺少某个库,用 -l 参数将库加入。Linux的库命名是一致的, 一般为 libxxx.so, 或 libxxx.a, libxxx.la, 要链接某个库就用   -lxxx,去掉头 lib 及 "." 后面的 so, la, a 等即可。 常见的库链接方法为

linux编译器——gcc/g++

1.gcc linux上先要安装, sudo yum install gcc gcc --version 可以查看当前的版本 ,我们默认安装的是4.8.5的版本,比较低, gcc test.c -std=c99 可以使他支持更高版本的c标准 -o 可以殖指明生成文件的名字,可以自己命名,比如 gcc test.c -o my.exe -std=c99 或者 gcc -o my.exe

gcc make cmake例程

main.cpp文件: #include <iostream>#include "utils.h"int main(void) {int a = 1;int b = 2;int c = AddFunc(a, b);std::cout<< c <<std::endl;return 0;} utils.h文件: #pragma onceint AddFunc(int a, int b);

ubuntu安装多个版本的g++和gcc,并设置默认版本的c++和g++

https://blog.csdn.net/yoyofu007/article/details/102934990