29.5 परमाणु प्रकार सी ++ स्टैंडर्ड नवंबर 2014 काम मसौदा की में यह कहा गया है:क्यों जी ++ अभी भी आवश्यकता होती है -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 ]
तो - जहाँ तक मैं बता सकता हूँ के रूप में - यह:
#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();
}
पूरी तरह मान्य मानक सी ++ 14 (और सी ++ 11) कोड होना चाहिए। हालांकि, अगर मैं मैन्युअल libatomic
लिंक नहीं करते, आदेश
g++ -std=c++14 <filename>
देता है - कम से कम फेडोरा 22 (जीसीसी 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
अभी भी जरूरी है, या यह ऐसा कुछ है जिसे संकलक रखरखावकर्ताओं द्वारा संबोधित नहीं किया गया है, फिर भी?
ध्यान दें कि सी ++ मानक कुछ हद तक संदिग्ध है कि पुस्तकालय एक अलग घटक है - लाइब्रेरी अनुभाग काफी स्टैंडअलोन हैं, लेकिन मानक में "कार्यान्वयन" का अर्थ संकलक और पुस्तकालय का संयोजन है। – MSalters
अगर मैं गलत हूं, तो मुझे सही करें, लेकिन जीसीसी करता है - डिफ़ॉल्ट रूप से - कुछ पुस्तकालयों को शामिल करें, तो डिफ़ॉल्ट '-latomic' अलग कैसे होगा? – MikeMB
@MSalters: हाँ, लेकिन जीसीसी के मामले में, "कार्यान्वयन" का अर्थ है "जीसीसी और कुछ संगत मानक पुस्तकालय"। यही वह है जिसे मैं इंगित करना चाहता था - कंपाइलर और उसके (एन) मानक पुस्तकालयों के * एक * के बीच एक अभी तक अंतिम रूप से एपीआई नहीं है, और आप संकलक लोगों से अलग '-latomic' प्राप्त करते हैं जो इसे नहीं सोचते मैथ कोड के लिए '-lm' की आवश्यकता के लिए सभी समस्याग्रस्त हैं। चारों ओर कोई बड़ा सौदा नहीं। – DevSolar