14

C++ 標準 2014年11 月のワーキング ドラフトの29.5 Atomic typesでは、次のように述べられています。

  1. ジェネリック クラス テンプレート アトミックがあります。テンプレート引数 T の型は自明にコピー可能でなければならない (3.9)。[ 注: 静的に初期化できない型引数は使いにくい場合があります。—終わりのメモ]

だから - 私が知る限り - これ:

#include <atomic>

struct Message {
    unsigned long int a;
    unsigned long int b;
};

std::atomic<Message> sharedState;

int main() {    
    Message tmp{1,2};       
    sharedState.store(tmp);         
    Message tmp2=sharedState.load();
}

完全に有効な標準の c++14 (および c++11) コードである必要があります。libatomicただし、手動でリンクしない場合、コマンド

g++ -std=c++14 <filename>

与える-少なくともFedora 22(gcc 5.1)-次のリンクエラー:

/tmp/ccdiWWQi.o: In function `std::atomic<Message>::store(Message, std::memory_order)':
main.cpp:(.text._ZNSt6atomicI7MessageE5storeES0_St12memory_order[_ZNSt6atomicI7MessageE5storeES0_St12memory_order]+0x3f): undefined reference to `__atomic_store_16'
/tmp/ccdiWWQi.o: In function `std::atomic<Message>::load(std::memory_order) const':
main.cpp:(.text._ZNKSt6atomicI7MessageE4loadESt12memory_order[_ZNKSt6atomicI7MessageE4loadESt12memory_order]+0x1c): undefined reference to `__atomic_load_16'
collect2: error: ld returned 1 exit status

私が書くなら

g++ -std=c++14 -latomic <filename>

すべて順調。標準では、含める必要があるコンパイラ フラグやライブラリについて何も述べていないことはわかっていますが、これまでのところ、標準に準拠した単一ファイル コードは最初のコマンドでコンパイルできると考えていました。

では、なぜそれが私のコード例に当てはまらないのでしょうか? それでも必要な合理的な理由-latomicはありますか、それともコンパイラのメンテナによってまだ対処されていないだけですか?

4

3 に答える 3

1

標準では、含める必要があるコンパイラ フラグやライブラリについて何も述べていないことを知っています。

右。

しかし、これまでのところ、標準に準拠した単一ファイルのコードは最初のコマンドでコンパイルできると考えていました。

うーん、ダメ。おっしゃる通り、これを前提する理由は特にありません。GCC 拡張機能がデフォルトで有効になっていることも考慮してください。

-latomicそうは言っても、ランタイムが少し落ち着いたら、ランタイムのデフォルトの部分を作成することが意図されていることは自明のようです。

于 2015-06-02T09:38:41.117 に答える
-3

g++gcc正しい C++ ライブラリを追加するラッパーです。明らか-latomicにそのリストから欠落しています。コア コンパイラの問題ではなく、単にラッパーの小さなバグです。

于 2015-06-02T09:20:07.227 に答える