9

でコンパイルして、 atomic builtins__atomic_load_nページから使用しようとしていますgcc

gcc -Wall -march=i686 -std=gnu99 ll.c -o ll

しかし、それはできないと言います

警告: 関数 '__atomic_load_n' の暗黙の宣言</p>

フラグとフラグを指定するだけで十分だと思いましたgcc(フラグを設定して確認しました) が、役に立ちませんでした。実際、コモンまたはマクロをテストしても値がないように見えます...しかし、Ubuntuに付属するかなりバニラのインストールがあります。archmarchstd=gnu99__GCC_VERSION____GNUC__gcc

ばかげたことをしていることはわかっていますが、何をしているのかわかりません。私は gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 を持っています

コードは次のようになります。これは (まだ) 呼び出されない関数なので、問題はコンパイル時に発生します。

type* func(type* p) {
    type* q = __atomic_load_n (p, __ATOMIC_SEQ_CST);
}
4

1 に答える 1

19

GCC 4.6.3 までは、アトミック操作用のコンパイラ ビルトインは純粋なコンパイラ拡張機能であり、GCC では__sync_*関数ファミリにグループ化されていました。

バージョン 4.7.0 の時点で、新しい C++11 標準と C11 標準の両方が最終化されており、GCC はこれら 2 つの新しい言語リビジョンの新しいメモリ モデルをより適切に反映するようにアトミック ビルトインを更新しました。新しい機能は__atomic_*ファミリにグループ化されます。

ただし、古いビルトインは引き続き使用できドキュメントには次のように記載されています。

呼び出しをメモリ モデルを使用した呼び出しに置き換えることは常に安全です。__sync__atomic__ATOMIC_SEQ_CST

于 2012-12-19T09:42:06.937 に答える