Por que o g ++ ainda requer -latomic
No29.5 Tipos atômicos da minuta de trabalho do C ++ Standard de novembro de 2014, declara:
Existe um modelo de classe genérico atômico. O tipo do argumento do modelo T deve ser trivialmente copiável (3.9). [Nota: argumentos de tipo que também não são estaticamente inicializáveis podem ser difíceis de usar. - end note]Então - até onde eu sei - isto:
#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();
}
deve ser um código padrão c ++ 14 perfeitamente válido (e também c ++ 11). No entanto, se eu não vincularlibatomic
manualmente, o comando
g++ -std=c++14 <filename>
dá - pelo menos no Fedora 22 (gcc 5.1) - o seguinte erro de vinculação:
/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
Se eu escrever
g++ -std=c++14 -latomic <filename>
tudo está bem. Eu sei que o padrão não diz nada sobre sinalizadores ou bibliotecas do compilador que precisam ser incluídos, mas até agora pensei que qualquer código de arquivo único compatível com o padrão possa ser compilado através do primeiro comando.
Então, por que isso não se aplica ao meu código de exemplo? Existe um motivo racional-latomic
ainda é necessário ou ainda é algo que ainda não foi tratado pelos mantenedores do compilador?