GCCアトミックビルトインに追加の「汎用」バージョンが必要なのはなぜですか?


8

https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.htmlによると、

type __atomic_load_n (type *ptr, int memorder)

(「ジェネリック」):

void __atomic_load (type *ptr, type *ret, int memorder)

その後

void __atomic_store_n (type *ptr, type val, int memorder)

と(「ジェネリック」)

void __atomic_store (type *ptr, type *val, int memorder)

後者のバージョンの総称は何ですか(それは前のバージョンの総称ではありません)、なぜそれらが必要なのですか?

回答:


4

答えはGCCマニュアルのセクション6.55にあります。

'__atomic'ビルトインは、長さが1、2、4、または8バイトの任意の整数スカラーまたはポインター型で使用できます。アーキテクチャで '__int128'(__int128を参照)がサポートされている場合は、16バイトの整数型も許可されます。

4つの非算術関数(load、store、exchange、compare_exchange)もすべてジェネリックバージョンを持っています。この汎用バージョンは、あらゆるデータ型で機能します。特定のデータ型サイズで可能であれば、ロックフリーの組み込み関数を使用します。それ以外の場合、外部呼び出しは実行時に解決されます。この外部呼び出しは同じ形式で、ポイントされているオブジェクトのサイズを示す最初のパラメーターとして「size_t」パラメーターが追加されています。すべてのオブジェクトは同じサイズでなければなりません。


まだ2つのバージョンを用意する必要はないように思えます。もちろん、関数を使用する場合、参照によって大きなオブジェクトを取得するのが賢明ですが、これらはコンパイラ組み込み関数です。コンパイラーは、2つのAPIでユーザーを煩わせることなく、必要に応じてポインターを内部で使用できる必要があります。
PSkocik

1
@PSkocik 肩をすくめる彼らがそうしないことを選んだ理由の背後にいくつかの理由があると確信しています(コンパイラチームは一般に、あるメカニズムを別のメカニズムよりも選ぶ理由の背後にある種のポリシーを持っています)。あなたが本当にそれについて興味があるなら、私はあなたがgccコミュニティに連絡することをお勧めします(彼らのgccリストを介して- メーリングリストのページを見てください)。私がgccコミュニティとやり取りしてから久しぶりですが、以前はそれらが楽しくて役に立ちました。
John Szakmeister
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.