एज़्टेक रैखिक सिस्टम सॉल्वर लाइब्रेरी का उपयोग करते समय मैं अजीब व्यवहार में भाग गया। Valgrind का उपयोग करके, मुझे पता चला कि यह पुस्तकालय ओवरलैपिंग बफर पर memcpy
करता है। विशिष्टता का कहना है कि ओवरलैपिंग बफर पर memcpy
का व्यवहार परिभाषित नहीं किया गया है।ओवरलैपिंग बफर
ऐसा लगता है कि memcpy
कई मशीनों पर समान व्यवहार किया है जैसे कि आप पाश के लिए एक साथ यह करना होगा और इसलिए आप सुरक्षित रूप से एक कम गंतव्य के लिए एक उच्च स्रोत से कॉपी कर सकते हैं:
for(int i = 0; i < len; i ++)
dest[i] = source[i];
लेकिन पर ओवरलैपिंग बफर के हमारे बड़े क्लस्टर, memcpy
का एक अलग व्यवहार है जो समस्याओं का कारण बनता है।
अब मुझे आश्चर्य है कि लाइब्रेरी में ओवरलैपिंग memcpy
सामान्य है या सिर्फ मेरे कोड में एक और बग के कारण होता है। चूंकि लाइब्रेरी का व्यापक रूप से उपयोग किया जाता है, मुझे लगता है कि memcpy
समस्या पहले खोजी जानी चाहिए। दूसरी ओर, यह अभी भी संभव है कि memcpy
कार्यान्वयन का विशाल बहुमत लूप के समान व्यवहार करता है और इसलिए किसी को भी इस समस्या का सामना नहीं हुआ।
- क्या कोई मुझे विभिन्न मशीनों पर
memcpy
ओवरलैपिंग के साथ अपने अनुभवों के बारे में बता सकता है? - मेरे कंप्यूटर सिस्टम का कौन सा हिस्सा वास्तव में
memcpy
प्रदान करता है?
मैं यह इंगित करना चाहता हूं कि यह प्रश्न विभिन्न कार्यान्वयन के साथ व्यावहारिक अनुभव के बारे में है, विनिर्देश के बारे में नहीं।
कृपया एक न्यूनतम उदाहरण प्रदान करें, ताकि हम आपकी समस्या का पुनरुत्पादन कर सकें और आपको बताएं कि बग लाइब्रेरी में है या आपके कोड में है। – OmnipotentEntity
मैंने इस मुद्दे को memcpy के साथ कभी नहीं समझा है। निश्चित रूप से, यह केवल यह पता लगाने के लिए तुलनात्मक है कि आपको स्रोत बफर के ऊपर या नीचे से कॉपी करने की आवश्यकता है या नहीं? –
@ मार्टिन जेम्स बहुत पहले और बहुत दूर, _heavily_ की प्राथमिकताओं का उपयोग 'memcpy()' ने इसे अत्यधिक दुबला होने के लिए बाध्य किया। उस समय के मानकों के अनुसार, "एक तुलना" ब्लोट-वेयर था और _typically_ की आवश्यकता नहीं थी - आगे यह कुछ अनुकूलन को रोकता है। यह बस प्रणाली धीमा कर दिया। इसलिए 'memmove() 'का जन्म। – chux