Utilizzo GCC 4.7.2 su Debian e errori di linker ogni volta che si tenta di utilizzare le strutture <atomic>
con valori a 16 byte. Sono in esecuzione una macchina virtuale x86_64 in grado di supportare l'istruzione CMPXCHG16B
, ma anche se non avessi l'hardware necessario, non vedo perché qui dovrebbe essere generato un errore del linker. Per quanto ne so, si suppone che la libreria <atomic>
ricada sui normali blocchi se l'hardware non supporta l'operazione CAS necessaria.Errore linker di riferimento non definito quando si utilizza CAS a 16 byte con GCC
In ogni caso, ecco un semplice banco di prova per riprodurre questo problema:
#include <atomic>
#include <cstdint>
struct foo
{
std::uint64_t x;
std::uint64_t y;
};
int main()
{
std::atomic<foo> f1({0,0});
foo f2 = {0,0};
foo f3 = {1,1};
f1.compare_exchange_strong(f2, f3);
}
Quando compilo questo, ottengo:
# g++ test.cpp -o test -std=c++11 -g3
/tmp/ccziKZis.o: In function `std::atomic<foo>::compare_exchange_strong(foo&, foo, std::memory_order, std::memory_order)':
/usr/include/c++/4.7/atomic:259: undefined reference to `__atomic_compare_exchange_16'
collect2: error: ld returned 1 exit status
Si noti che se cambio il programma in modo che foo
è solo 8 byte, non ottengo l'errore del linker. Cosa sta succedendo qui?
Interessante, posso repro questo con g ++ 4.8.2 e clang ++ 3.6. Non sei sicuro di quale sia il problema di fondo, ma sembra un bug nella libreria standard, o qualcosa del genere. –