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_ 関数。このタイプのメソッドは常にインライン展開され、エントリ アドレスがなく、関数内でのみ使用できます (式では、インライン展開するとコンパイル エラーが発生します)。
(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() 関数で解放する必要があります。