आपको C में गणित पुस्तकालय को क्यों लिंक करना है?


254

यदि मैं संकलित करते समय मुझे किसी सी प्रोग्राम में शामिल करता है <stdlib.h>या <stdio.h>नहीं करता है, लेकिन मुझे उदाहरण के लिए, gcc <math.h>का उपयोग करके लिंक करना होगा -lm:

gcc test.c -o test -lm

इसका क्या कारण है? मुझे गणित पुस्तकालय को स्पष्ट रूप से क्यों जोड़ना है लेकिन अन्य पुस्तकालयों को नहीं?

जवाबों:


249

में काम करता है stdlib.hऔर stdio.hमें कार्यान्वयन है libc.so(या libc.aस्थिर जोड़ने के लिए), (जैसे कि जो डिफ़ॉल्ट रूप से अपने निष्पादन में जुड़ा हुआ है -lcनिर्दिष्ट किया गया)। GCC को निर्देश दिया जा सकता है कि वह इस स्वचालित लिंक से -nostdlibया -nodefaultlibsविकल्पों से बचें ।

गणित math.hमें libm.so(या libm.aस्थैतिक लिंकिंग के लिए) कार्यान्वयन हैं , और libmडिफ़ॉल्ट रूप से लिंक नहीं है। इसके libm/ libcविभाजन के ऐतिहासिक कारण हैं , उनमें से कोई भी बहुत ठोस नहीं है।

दिलचस्प बात यह है कि सी ++ रनटाइम की libstdc++आवश्यकता होती है libm, इसलिए यदि आप जीसीसी ( g++) के साथ सी ++ प्रोग्राम को संकलित करते हैं , तो आप स्वचालित रूप से libmलिंक हो जाएंगे ।


8
लिनक्स के साथ इसका कोई लेना-देना नहीं है, क्योंकि यह लिनक्स से बहुत पहले आम था। मुझे संदेह है कि इसे निष्पादन योग्य आकार को कम करने की कोशिश के साथ कुछ करना है, क्योंकि बहुत सारे कार्यक्रम हैं जिन्हें गणित कार्यों की आवश्यकता नहीं है।
डेविड थॉर्नले

39
प्राचीन प्रणालियों पर, यदि गणित के कार्यों को libc में समाहित किया गया था, तो सभी कार्यक्रमों का संकलन धीमा होगा, आउटपुट निष्पादन बड़े होंगे, और रनटाइम को अधिक मेमोरी की आवश्यकता होगी, अधिकांश कार्यक्रमों के लिए कोई लाभ नहीं होगा जो इन गणित कार्यों का उपयोग नहीं करते हैं। इन दिनों हमारे पास साझा पुस्तकालयों के लिए अच्छा समर्थन है, और यहां तक ​​कि जब सांख्यिकीय रूप से जोड़ने पर भी, मानक पुस्तकालय स्थापित किए जाते हैं ताकि अप्रयुक्त कोड को त्याग दिया जा सके, इसलिए इनमें से कोई भी अच्छे कारण नहीं हैं।
युगांतरकारी

38
@ephemient पुराने दिनों में भी, लाइब्रेरी से लिंक करने से लाइब्रेरी की सभी सामग्री निष्पादन योग्य नहीं हो जाती थीं। लिंकर्स, हालांकि अक्सर अनदेखी की जाने वाली तकनीक, ऐतिहासिक रूप से काफी प्रभावी रही हैं।

7
@ephemient इसके अलावा, साझा लाइब्रेरी आपके विचार से अधिक समय तक आसपास रही हैं। उनका आविष्कार 1950 में हुआ था, 1980 के दशक में नहीं।

5
मुझे लगता है कि दिन के अंत में हम जो देख रहे हैं वह जीसीसी रूढ़िवाद से ज्यादा कुछ नहीं है: "यह हमेशा इस तरह काम किया है"। मैं केवल यही चाहता हूं कि वे अपने संकलक एक्सटेंशन के लिए एक ही तर्क लागू करें।

77

याद रखें कि सी एक पुरानी भाषा है और एफपीयू अपेक्षाकृत हाल की घटना है। मैंने पहली बार C को 8-बिट प्रोसेसर पर देखा था जहाँ 32-बिट पूर्णांक अंकगणित करने के लिए बहुत काम था। इन कार्यान्वयन में से कई भी नहीं किया है एक चल बिन्दु गणित पुस्तकालय उपलब्ध है!

यहां तक ​​कि पहले 68000 मशीनों (मैक, अटारी एसटी, अमीगा) पर, फ़्लोटिंग पॉइंट कॉप्रोसेसर्स अक्सर महंगे ऐड-ऑन थे।

वह सब फ़्लोटिंग पॉइंट गणित करने के लिए, आपको एक बहुत बड़े आकार के पुस्तकालय की आवश्यकता थी। और गणित धीमा होने वाला था। इसलिए आपने शायद ही कभी तैरने का इस्तेमाल किया हो। आपने पूर्णांक या स्केल किए गए पूर्णांक के साथ सब कुछ करने का प्रयास किया। जब आपको math.h को शामिल करना था, तो आपने अपने दांत पीस लिए। अक्सर, आप इससे बचने के लिए अपने स्वयं के सन्निकटन और लुकअप टेबल लिखेंगे।

लंबे समय से व्यापार-बंद अस्तित्व में था। कभी-कभी "फास्टमथ" या इस तरह के गणित पैकेजों की प्रतिस्पर्धा होती थी। गणित के लिए सबसे अच्छा समाधान क्या है? वास्तव में सटीक लेकिन धीमी गति से सामान? गलत लेकिन तेज? ट्रिग फ़ंक्शंस के लिए बड़ी टेबल? यह तब तक नहीं था जब तक कि कंप्यूटर में कोप्रोसेसरों की गारंटी नहीं दी गई थी कि अधिकांश कार्यान्वयन स्पष्ट हो गए थे। मुझे लगता है कि कुछ प्रोग्रामर अभी वहाँ कहीं है, एक एम्बेडेड चिप पर काम कर रहा है, यह तय करने की कोशिश कर रहा है कि कुछ गणित की समस्या को संभालने के लिए गणित पुस्तकालय में लाया जाए या नहीं।

इसलिए गणित मानक नहीं था । कई या शायद अधिकांश कार्यक्रमों ने एक फ्लोट का उपयोग नहीं किया। यदि FPUs हमेशा आसपास होते थे और फ्लोट्स और डबल्स हमेशा ऑपरेट करने के लिए सस्ते होते थे, तो इसमें कोई शक नहीं कि "स्टैडम" होता।


हेह, मैं एक डेस्कटॉप पीसी में जावा में (1 + x) ^ y के लिए पेड सन्निकटन का उपयोग कर रहा हूं। लॉग, ऍक्स्प और पॉव अभी भी धीमे हैं।
मात्रा_देव

अच्छी बात। और मैंने ऑडियो प्लग इन में पाप () के लिए सन्निकटन देखे हैं।
नोसरेडना

11
यह बताता है कि libmडिफ़ॉल्ट रूप से लिंक क्यों नहीं किया गया है, लेकिन गणित C89 से मानक था और इससे पहले, K & R ने इसे वास्तविक रूप से मानकीकृत किया था, इसलिए आपकी "stdmath" टिप्पणी का कोई मतलब नहीं है।
फ्रेड फू

@FredFoo प्रकार और इंटरफेस मानकीकृत थे, लेकिन कार्यान्वयन नहीं। मुझे लगता है कि नोसरेडना एक मानक गणित पुस्तकालय की बात कर रहे हैं।
टिम बर्ड

72

हास्यास्पद ऐतिहासिक प्रथा के कारण जिसे कोई ठीक करने को तैयार नहीं है। C और POSIX द्वारा आवश्यक सभी फ़ंक्शंस को एक ही लाइब्रेरी फ़ाइल में समेकित करने से न केवल इस सवाल को बार-बार पूछे जाने से बचना होगा, बल्कि डायनेमिक लिंकिंग के दौरान समय और मेमोरी की महत्वपूर्ण मात्रा भी बच जाएगी, क्योंकि .soलिंक की गई प्रत्येक फ़ाइल को फाइलसिस्टम ऑपरेशन की आवश्यकता होती है इसे खोजने और खोजने के लिए, और इसके स्थैतिक चर, स्थानांतरण, आदि के लिए कुछ पृष्ठ।

एक कार्यान्वयन जहां सभी कार्य एक पुस्तकालय और में हैं -lm, -lpthread, -lrt, आदि विकल्प सभी में कोई-ऑप्स (या खाली करने के लिए लिंक कर रहे हैं .aफ़ाइलें) पूरी तरह से है POSIX अनुरूप और निश्चित रूप से बेहतर।

नोट: मैं POSIX के बारे में बात कर रहा हूं क्योंकि C खुद ही इस बारे में कुछ भी निर्दिष्ट नहीं करता है कि कंपाइलर कैसे लगाया जाता है। इस प्रकार आप केवल gcc -std=c99 -lmकार्यान्वयन-विशिष्ट तरीके के रूप में व्यवहार कर सकते हैं संकलक व्यवहार के लिए संकलक को आमंत्रित किया जाना चाहिए।


9
+1 यह इंगित करने के लिए कि POSIX के लिए अलग-अलग लिबम, लिबक और लिब्रेट लाइब्रेरी मौजूद नहीं हैं। एक उदाहरण के रूप में, मैक ओएस पर सब कुछ एक ही लिबास सिस्टम में स्थित है (जिसमें लिबीडीबीएम, लिबड्ल, लिबगच_एस, लिबिनफो, लिबम, लिबपॉल, लिबप्रो और लाइब्रस पीवीसी) भी शामिल है।
F'x

3
एक लिंक, या संख्या के साथ समर्थन के बिना प्रदर्शन पर लाइब्रेरी लुकअप प्रभाव के बारे में अनुमान लगाने के लिए -1। "प्रोफाइल। अटकलें न
लगाएं

12
यह अटकलबाजी नहीं है। मेरे पास कोई प्रकाशित पत्र नहीं है, लेकिन मैंने सभी माप खुद किए हैं और अंतर बहुत बड़ा है। straceडायनामिक लिंकिंग पर कितना स्टार्टअप का समय बिताया जाता है, यह देखने के लिए समय निर्धारण विकल्पों में से एक का उपयोग करें, या ./configureऐसी प्रणाली पर चलने की तुलना करें जहां सभी मानक उपयोगिताओं को स्थिर-लिंक बनाम एक से जोड़ा जाता है जहां वे डायनामिक-लिंक्ड हैं। यहां तक ​​कि मुख्यधारा के डेस्कटॉप ऐप डेवलपर्स और सिस्टम इंटीग्रेटर्स गतिशील लिंकिंग की लागतों से अवगत हैं; यही कारण है कि प्रीलिंक जैसी चीजें मौजूद हैं। मुझे यकीन है कि आप उन कुछ पत्रों में बेंचमार्क पा सकते हैं।
आर .. गिटहब स्टॉप हेल्पिंग ICE

1
ध्यान दें कि POSIX को-lm स्वीकार करने की आवश्यकता होती है और ऐसे अनुप्रयोग जो गणित के इंटरफेस का उपयोग करते हैं -lm, उन्हें अवश्य उपयोग करना चाहिए , लेकिन यह कंपाइलर कमांड द्वारा संभाला एक आंतरिक विकल्प हो सकता है (या यहां तक ​​कि अनदेखा किया जा सकता है), वास्तविक लाइब्रेरी फ़ाइल नहीं। या यह सिर्फ एक खाली .aफाइल हो सकती है यदि इंटरफेस मुख्य परिवाद में हैं।
आर .. गिटहब स्टॉप हेल्पिंग ICE

6
@ एफएक्स: न जाने क्यों मैं इससे पहले इसका उल्लेख करना भूल गया: strace -ttआसानी से आपको गतिशील लिंकिंग पर बिताया गया समय दिखाएगा। यह सुंदर नहीं है। और लिनक्स पर, निरीक्षण करने /proc/sys/smapsसे आपको अतिरिक्त पुस्तकालयों की मेमोरी ओवरहेड दिखाई देगी।
आर .. गिटहब स्टॉप हेल्पिंग ICE

33

क्योंकि time()और कुछ अन्य फ़ंक्शंस builtinसी लाइब्रेरी ( libc) में ही परिभाषित हैं और GCC हमेशा लिबास से लिंक करता है जब तक कि आप -ffreestandingसंकलन विकल्प का उपयोग नहीं करते हैं । हालाँकि गणित के कार्य जीवित रहते हैं, libmजो गुप्त रूप से जुड़े हुए नहीं होते हैं।


8
LLVM gcc पर मुझे -lm नहीं जोड़ना है। ऐसा क्यों है?
बॉट 47

26

एक स्पष्टीकरण यहाँ दिया गया है :

इसलिए यदि आपका प्रोग्राम गणित के कार्यों और सहित का उपयोग कर रहा है math.h, तो आपको -lmध्वज को पास करके गणित पुस्तकालय को स्पष्ट रूप से लिंक करना होगा । इस विशेष पृथक्करण का कारण यह है कि गणितज्ञ अपने गणित की गणना के तरीके के बारे में बहुत चुस्त हैं और वे मानक कार्यान्वयन के बजाय गणित के अपने स्वयं के कार्यान्वयन का उपयोग करना चाह सकते हैं। अगर गणित के कार्यों में गांठ पड़ गई तो libc.aऐसा करना संभव नहीं होगा।

[संपादित करें]

मुझे यकीन नहीं है कि मैं इससे सहमत हूं, हालांकि। यदि आपके पास एक पुस्तकालय है जो प्रदान करता है, कहता है, sqrt()और आप इसे मानक पुस्तकालय से पहले पास करते हैं, तो एक यूनिक्स लिंकर आपके संस्करण को ले जाएगा, है ना?


10
मुझे नहीं लगता कि कोई गारंटी है कि ऐसा होगा; आप इसके बजाय एक प्रतीक संघर्ष के साथ समाप्त हो सकते हैं। यह शायद लिंकर और लाइब्रेरी के लेआउट पर निर्भर करेगा। मुझे अभी भी वह कारण कमजोर लगता है; यदि आप एक कस्टम sqrt फ़ंक्शन कर रहे हैं, तो आपको वास्तव में इसे मानक sqrt फ़ंक्शन के समान नाम नहीं देना चाहिए, भले ही वह एक ही काम करता हो ...
ephemient

1
वास्तव में, sqrtअपरिभाषित व्यवहार के साथ एक कार्यक्रम में अपने स्वयं के फ़ंक्शन (गैर-स्थिर) नाम दिए गए हैं।
आर .. गिटहब स्टॉप हेल्पिंग ICE

@ बास्टियन अच्छा लगता है। और अपनी बात पर आते हुए, "मानक पुस्तकालय से पहले" से आपका क्या मतलब है? मुझे लगा, मानक पुस्तकालय डिफ़ॉल्ट रूप से जुड़ा हुआ है और कमांड लाइन विकल्पों के माध्यम से लिंक करने की आवश्यकता नहीं है। तो, मानक पुस्तकालय लिंकर के लिए पहला गो-इन होगा और कोई अपना कार्यान्वयन "मानक पुस्तकालय से पहले" नहीं रख सकता है।
रॉकी इन्दे

@RockyInde: मेरे जवाब को देखो, मुझे लगता है कि मैं वास्तव में "मानक गणित पुस्तकालय से पहले" था। लेकिन मुझे लगता है कि मानक सी लाइब्रेरी को लिंक नहीं करने के लिए कंपाइलर विकल्प हैं, जो आपको आपका पास करने की अनुमति देगा।
बैस्टियन लेओनार्ड

@ बास्टिएनलोनार्ड मैं संस्करण of.२ का उपयोग करता हूं, जो -lmपूरी तरह से वैकल्पिक है। किसी भी विचार
Donghua लियू

5

जीसीसी के लिए एक परिचय में बाहरी पुस्तकालयों को जोड़ने की गहन चर्चा है - बाहरी पुस्तकालयों के साथ जोड़ना । यदि कोई पुस्तकालय मानक पुस्तकालयों (जैसे stdio) का सदस्य है, तो आपको उन्हें लिंक करने के लिए संकलक (वास्तव में लिंकर) को निर्दिष्ट करने की आवश्यकता नहीं है।

EDIT: कुछ अन्य उत्तरों और टिप्पणियों को पढ़ने के बाद, मुझे लगता है कि libc.a संदर्भ और libm संदर्भ है कि यह दोनों के लिंक के बारे में बहुत कुछ कहना है कि दोनों अलग क्यों हैं।

ध्यान दें कि 'libm.a' (गणित पुस्तकालय) में कई फ़ंक्शन 'math.h' में परिभाषित हैं, लेकिन libc.a में मौजूद नहीं हैं। कुछ हैं, जो भ्रामक हो सकते हैं, लेकिन अंगूठे का नियम यह है - सी लाइब्रेरी में उन कार्यों को शामिल किया गया है जो एएनएसआई तय करते हैं, मौजूद होना चाहिए, ताकि आपको केवल एएनएसआई फ़ंक्शन का उपयोग करने की आवश्यकता न हो। इसके विपरीत, `libm.a 'में अधिक कार्य होते हैं और अतिरिक्त कार्यक्षमता का समर्थन करते हैं जैसे एफपी त्रुटियों के मामले में मैथेरर कॉल-बैक और व्यवहार के कई वैकल्पिक मानकों का अनुपालन। अधिक विवरण के लिए, अनुभाग लिब्म देखें।


1
जो इस सवाल का जवाब नहीं देता है कि आपको मैच लाइब्रेरी में अलग से लिंक क्यों करना है। स्पष्ट रूप से आपको ओपनजीएल पुस्तकालयों को अलग से जोड़ना होगा, लेकिन यकीनन गणित पुस्तकालय आमतौर पर उपयोगी होते हैं।
डेविड थॉर्नले

@ डेविड: सही है आप। यह मुझे इस सवाल से स्पष्ट नहीं था कि यह ओपी के बारे में पूछ रहा था। जैसे ही आपने टिप्पणी की, मैं अपना उत्तर संपादित कर रहा था।
छिपकली

मुझे पता है कि मैंने एक कार्यक्रम संकलित किया है जो sqrtफ़ंक्शन का उपयोग करता है और यह पुस्तकालय के माध्यम से शामिल किए बिना काम करता है -lm। धन्यवाद!
L_K

5

जैसा कि कहा जाता है, सी लाइब्रेरी लायबिलिटी डिफ़ॉल्ट रूप से जुड़ी हुई है और इस लाइब्रेरी में stdlib.h, stdio.h और कई अन्य मानक हेडर फ़ाइलों का कार्यान्वयन है। सी में मूल "हैलो वर्ल्ड" प्रोग्राम के लिए लिंकर कमांड " एन परिचय टू एनसीसी " के अनुसार, इसे नीचे जोड़ने के लिए बस इस प्रकार है :

ld -dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o 
/usr/lib/crti.o /usr/libgcc-lib /i686/3.3.1/crtbegin.o
-L/usr/lib/gcc-lib/i686/3.3.1 hello.o -lgcc -lgcc_eh -lc 
-lgcc -lgcc_eh /usr/lib/gcc-lib/i686/3.3.1/crtend.o /usr/lib/crtn.o

तीसरी लाइब्रेरी में ऑप्शन देखें -lc जो C लाइब्रेरी को लिंक करता है।


3

मुझे लगता है कि यह एक प्रकार की मनमानी है। आपको कहीं न कहीं एक रेखा खींचनी होगी (जो पुस्तकालय डिफ़ॉल्ट हैं और जिन्हें निर्दिष्ट करने की आवश्यकता है)।

यह आपको एक अलग कार्य के साथ इसे बदलने का अवसर देता है जिसमें समान कार्य हैं, लेकिन मुझे नहीं लगता कि ऐसा करना बहुत आम है।

संपादित करें: (अपनी टिप्पणियों से): मुझे लगता है कि मूल सीसी के साथ पश्चगामी संगतता बनाए रखने के लिए gcc यह करता है। Cc ऐसा क्यों करता है, इसके बारे में मेरा अनुमान है कि बिल्ड टाइम के कारण - cc मशीनों के लिए लिखा गया था, जिसकी तुलना में हमारे पास अब तक कम शक्ति है। बहुत सारे कार्यक्रमों में कोई फ़्लोटिंग-पॉइंट गणित नहीं है और वे शायद हर पुस्तकालय को ले गए जो आमतौर पर डिफ़ॉल्ट रूप से उपयोग नहीं किया गया था। मैं अनुमान लगा रहा हूं कि UNIX OS का निर्माण समय और इसके साथ जाने वाले उपकरण ड्राइविंग बल थे।


मुझे लगता है कि सवाल के पीछे मानसिकता यह है कि लिबम की सामग्री काफी हद तक मानक सी लाइब्रेरी का हिस्सा है, वे लिबास में क्यों नहीं हैं?
इवान टेरान

1
Gcc के लिए क्यों एटी एंड टी यूनिक्स में मूल सीसी के साथ संगतता बनाए रखना है। मैंने 1988 में 3B2 का उपयोग किया और आपको गणित प्राप्त करने के लिए -lm करना पड़ा। यह उस समय मेरे लिए पूरी तरह से मनमाना था। विजुअल स्टूडियो में, मुझे कभी गणित जोड़ने की याद नहीं है, लेकिन आपको कभी-कभी अन्य सी-रनटाइम लाइब्रेरीज़ को जोड़ना होगा। मुझे लगता है कि संकलक विक्रेताओं के पास एक कारण (निर्माण समय?) है, लेकिन अभी, मैं शर्त लगाता हूं कि बस पीछे की ओर संगत होने की कोशिश कर रहा है।
लू फ्रेंको

3

अगर मैं stdlib.h या stdio.h डालता हूं, तो मुझे उन लोगों को लिंक करने की आवश्यकता नहीं है, लेकिन जब मुझे संकलन करना होगा, तो मुझे लिंक करना होगा:

stdlib.h, stdio.hहेडर फाइलें हैं। आप उन्हें अपनी सुविधा के लिए शामिल करें। वे केवल पूर्वानुमान लगाते हैं कि क्या प्रतीक उपलब्ध हो जाएंगे यदि आप उचित पुस्तकालय में लिंक करते हैं। कार्यान्वयन लाइब्रेरी फ़ाइलों में हैं, यही वह जगह है जहाँ फ़ंक्शन वास्तव में रहते हैं।

समेत math.h सभी गणित कार्यों के लिए उपयोग प्राप्त करने के लिए केवल पहला कदम है।

इसके अलावा, libmयदि आपको #include <math.h>प्रतीकों के बारे में संकलक के लिए, यदि आप ऐसा नहीं करते हैं, तो भी आपको लिंक का उपयोग नहीं करना है, भले ही आप ऐसा करते हों, जो आपके लिए केवल एक सूचनात्मक कदम है।

stdlib.h, stdio.hमें उपलब्ध कार्यों को देखें libc, जो हमेशा ऐसा होता है ताकि उपयोगकर्ता को स्वयं ऐसा न करना पड़े।


2

stdio मानक C लाइब्रेरी का हिस्सा है, जो डिफ़ॉल्ट रूप से, gcc के विरुद्ध लिंक करेगा।

गणित फ़ंक्शन कार्यान्वयन एक अलग लिबम फ़ाइल में होते हैं जो डिफ़ॉल्ट रूप से लिंक नहीं होते हैं इसलिए आपको इसे निर्दिष्ट करना होगा -lm। वैसे, उन हेडर फ़ाइलों और लाइब्रेरी फ़ाइलों के बीच कोई संबंध नहीं है।


3
वह जानता है कि..वह पूछ रहा है कि क्यों
इवान टेरान

वह कहता है क्यों। साइमन बताते हैं कि कुछ पुस्तकालय डिफ़ॉल्ट रूप से जुड़े होते हैं, जैसे stdio जबकि गणित पुस्तकालय डिफ़ॉल्ट रूप से लिंक नहीं होता है, इसलिए इसे निर्दिष्ट करना होगा।
मन्ज़ो

5
मैं कहूंगा कि प्रश्न की प्रकृति पूछ रही है कि लिफ़्ड को डिफ़ॉल्ट रूप से लिंक नहीं किया गया है (या लिबेक से अलग भी) क्योंकि इसकी सामग्री काफी हद तक सी मानक पुस्तकालय का हिस्सा है।
इवान टेरान

2

मुझे लगता है कि यह उन ऐप्स को बनाने का एक तरीका है जो इसका उपयोग बिल्कुल बेहतर प्रदर्शन नहीं करते हैं। यहाँ इस पर मेरी सोच है।

x86 OSes (और मैं दूसरों की कल्पना करता हूं) एफपीयू राज्य को संदर्भ स्विच पर संग्रहीत करने की आवश्यकता है। हालांकि, ज्यादातर OSes पहली बार FPU का उपयोग करने के प्रयास के बाद इस स्थिति को बचाने / पुनर्स्थापित करने के लिए परेशान करते हैं।

इसके अतिरिक्त, गणित पुस्तकालय में संभवतः कुछ मूल कोड होते हैं जो FPU को लाइब्रेरी लोड होने पर एक बेस बेस स्टेट में सेट कर देंगे।

इसलिए, यदि आप किसी भी गणित कोड में लिंक नहीं करते हैं, तो इनमें से कोई भी नहीं होगा, इसलिए ओएस को किसी भी FPU स्थिति को बचाने / पुनर्स्थापित करने की आवश्यकता नहीं है, जिससे संदर्भ स्विच थोड़ा अधिक कुशल हो जाता है।

हालांकि सिर्फ एक अनुमान है।

संपादित करें: कुछ टिप्पणियों के जवाब में, एक ही आधार आधार अभी भी गैर-एफपीयू मामलों पर लागू होता है (आधार यह है कि यह उन ऐप्स को बनाने के लिए था, जिन्होंने उपयोग नहीं किया था लिबिडम प्रदर्शन थोड़ा बेहतर था)।

उदाहरण के लिए, यदि सी के शुरुआती दिनों में एक सॉफ्ट-एफपीयू था जो सी के शुरुआती दिनों में था, तब लिब्म अलग होने से बहुत बड़ी (और धीमी गति से अगर यह इस्तेमाल किया गया था) को अनावश्यक रूप से लिंक होने से रोका जा सकता है।

इसके अलावा, यदि केवल स्थैतिक लिंकिंग उपलब्ध है, तो एक समान तर्क लागू होता है कि यह निष्पादन योग्य आकार और संकलन समय को नीचे रखेगा।


यदि आप लिबम के साथ लिंक नहीं करते हैं, लेकिन x87 FPU को अन्य माध्यमों (फ्लोट पर संचालन, उदाहरण के लिए) के माध्यम से स्पर्श करते हैं, तो x86 कर्नेल को FPU स्थिति को बचाने की आवश्यकता होती है। मुझे नहीं लगता कि यह एक बहुत अच्छा अनुमान है ...
विशेषण

बेशक यदि आप मैन्युअल रूप से FPU का उपयोग करते हैं तो कर्नेल को अपनी स्थिति को बचाने / पुनर्स्थापित करने की आवश्यकता होगी। मैं कह रहा था कि यदि आप इसका उपयोग नहीं करते हैं (जिसमें लिबम का उपयोग नहीं करना है) तो यह अभ्यस्त होना चाहिए।
इवान टेरान

वास्तव में यह बहुत ही कर्नेल पर निर्भर कर सकता है। गणित पुस्तकालय जिस कर्नेल का उपयोग करता है उसमें एक save_FPU_on_switch () फ़ंक्शन हो सकता है जो इसे चालू करता है, जबकि अन्य केवल यह पता लगाते हैं कि क्या FPU को छुआ गया था।
अर्लज़

1
अगर मैं सही ढंग से याद करता हूं, तो पूरा मुद्दा लंबे समय तक फ्लोटिंग पॉइंट कोप्रोसेसर होता है, यहां तक ​​कि माइक्रोप्रोसेसर पर भी।
नोसरेडना

@ पर्लज़: गणित पुस्तकालय के अनुरोध को सहेजने का दृष्टिकोण एक भयानक डिजाइन होगा। यदि वे किसी अन्य माध्यम से FPU का उपयोग करते हैं तो क्या होगा? एकमात्र सामान्य दृष्टिकोण (इसके अलावा हमेशा बचत / पुनर्स्थापना के अलावा) उपयोग का पता लगाने और फिर बचत / बहाली शुरू करना होगा।
इवान टेरान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.