1. __builtin_popcount
int __builtin_popcount(unsigned int n)
int __builtin_popcountl(unsigned long n)
int __builtin_popcountll(unsigned long long n)
输入数字n,二进制表示中‘1’的个数。
int main() {
int num = 3;
cout << "how many 1s in num: " << __builtin_popcount(num) << endl;
return 0;
}
// how many 1s in num: 2
2. gcc __builtin_函数
1)gcc提供了很多__builtin_开头的内置函数,用于处理异常、可变长度参数列表、系统优化的目的,前2类不公开。
2)__builtin_函数分2类:
(1)没有C标准库对应方法的__builtin_函数,这类方法总是被inline展开,没有入口地址,只能用在函数中(不能用在表达式中,内联展开会导致编译错误)。
(2)有对应C标准库方法的__builtin_函数,内置函数和C库函数有完全相同的原型、入口地址。例如:__builtin_printf和printf。
如果通过编译参数(-fno-builtin)关闭内置函数,此时为了编译通过的方法:#define strcpy(d, s) __builtin_strcpy ((d), (s))
3. asprintf, vasprintf
int asprintf(char **strp, const char *fmt, ...);
int vasprintf(char **strp, const char *fmt, va_list ap);
功能类似sprintf、vsprintf,会为字符串分配足够的内存,并通过第一个参数strp返回新分配的内存。
strp指向的内容,需要用free()函数释放。