Trong 29,5 loại Atomic của C++ chuẩn Tháng Mười Một dự thảo năm 2014 làm việc nó khẳng định:Tại sao g ++ vẫn đòi hỏi -latomic
- There is a generic class template atomic. The type of the template argument T shall be trivially copyable (3.9). [ Note: Type arguments that are not also statically initializable may be difficult to use. —end note ]
Vì vậy, - như xa như tôi có thể nói - điều này:
#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();
}
phải là tiêu chuẩn hoàn toàn hợp lệ C++ 14 (và cũng C++ 11) mã. Tuy nhiên, nếu tôi không liên kết libatomic
bằng tay, lệnh
g++ -std=c++14 <filename>
cho - ít nhất là trên Fedora 22 (gcc 5.1) - lỗi liên kết sau đây:
/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
Nếu tôi viết
g++ -std=c++14 -latomic <filename>
mọi thứ đều ổn. Tôi biết rằng tiêu chuẩn không nói gì về cờ biên dịch hoặc thư viện phải được bao gồm, nhưng cho đến nay tôi nghĩ rằng bất kỳ sự phù hợp tiêu chuẩn nào, mã tệp đơn lẻ đều có thể được biên dịch thông qua lệnh đầu tiên.
Vậy tại sao điều đó không áp dụng cho mã ví dụ của tôi? Có một lý do hợp lý tại sao -latomic
vẫn còn cần thiết, hoặc là nó chỉ là một cái gì đó đã không được giải quyết bởi các nhà duy trì trình biên dịch, chưa?
Lưu ý rằng C++ Standard hơi mơ hồ cho dù thư viện là một thành phần riêng biệt - các phần thư viện khá độc lập, nhưng "việc thực hiện" trong chuẩn nghĩa là sự kết hợp của trình biên dịch và thư viện. – MSalters
Sửa tôi nếu tôi sai, nhưng gcc KHÔNG - theo mặc định - bao gồm một vài thư viện, vậy làm thế nào một '-latomic' mặc định sẽ khác? – MikeMB
@MSalters: Có, nhưng trong trường hợp của GCC, "việc thực hiện" có nghĩa là "GCC và một số thư viện chuẩn tương thích". Đó là những gì tôi muốn chỉ ra - một API chưa hoàn thiện giữa trình biên dịch và * một * của các thư viện chuẩn (n) của nó, và bạn nhận được một '-latomic' riêng biệt từ những người biên dịch mà không nghĩ rằng nó tất cả đều có vấn đề khi yêu cầu '-lm' cho mã toán học. Không có vấn đề lớn, tất cả xung quanh. – DevSolar