ठेठ नुकसान कर रहे हैं:
प्रोग्रामर कि sizeof (शून्य *) == 4 * sizeof (चार) द्वारा निहित धारणा। यदि आप यह धारणा बना रहे हैं और उदा। उस तरह से सरणी आवंटित करें ("मुझे 20 पॉइंटर्स चाहिए इसलिए मैं 80 बाइट आवंटित करता हूं"), आपका कोड 64 बिट पर टूट जाता है क्योंकि इससे बफर ओवररन्स हो जाता है।
"बिल्ली का बच्चा-हत्यारा", int x = (int) और कुछ; (और रिवर्स, शून्य * पीआरटी = (शून्य *) some_int)। फिर आकार (int) == आकार (शून्य *) की धारणा। इससे अतिप्रवाह नहीं होता है लेकिन डेटा खो देता है - पॉइंटर का उच्च 32 बिट, अर्थात्।
इन दोनों मुद्दों में एक प्रकार का वर्ग है जिसे टाइप एलियासिंग कहा जाता है (दो प्रकार के बीच बाइनरी प्रतिनिधित्व स्तर पर पहचान/इंटरचेंजबिलिटी/समकक्ष मानते हुए), और ऐसी धारणाएं आम हैं; की तरह संयुक्त राष्ट्र * एक्स पर, टाइम_टी, size_t, यह मानते हुए पूर्णांक किया जा रहा off_t, या Windows पर, संभालना, शून्य * और लंबे समय से किया जा रहा है विनिमेय, आदि ...
डेटा संरचना/ढेर स्थान उपयोग के बारे में अनुमान (नीचे 5. के रूप में देखें कुंआ)। सी/सी ++ कोड में, स्थानीय वैरिएबल को स्टैक पर आवंटित किया जाता है, और नीचे दी गई जगह के कारण 32 बिट और 64 बिट मोड के बीच उपयोग की गई जगह अलग होती है, और तर्क पारित करने के लिए अलग-अलग नियमों के कारण (32 बिट x86 आमतौर पर ढेर पर, 64 बिट रजिस्टरों में भाग में x86)। कोड जो कि 32 बिट पर डिफ़ॉल्ट स्टैक्सइज़ के साथ दूर हो जाता है, 64 बिट पर स्टैक ओवरफ़्लो क्रैश का कारण बन सकता है। क्रैश के कारण के रूप में यह अपेक्षाकृत आसान है लेकिन संभवतः ठीक करने के लिए एप्लिकेशन की कॉन्फ़िगर करने योग्यता के आधार पर।
32 बिट और 64 बिट कोड (विभिन्न कोड आकार/कैश पैरों के निशान, या विभिन्न मेमोरी एक्सेस विशेषताओं/पैटर्न, या विभिन्न कॉलिंग सम्मेलनों के कारण) के बीच अंतर अंतर "calibrations" तोड़ सकता है। कहें, के लिए (int i = 0; i < 1000000; ++ i) नींद (0); , एबीआई (अनुप्रयोग बाइनरी इंटरफ़ेस) होने की संभावना अंत में 32bit और 64bit के लिए अलग अलग समय के लिए ...
जा रहा है। आम तौर पर संकेत के आकार ... की तुलना में 64 बिट और 32 बिट वातावरण के बीच बड़ा मतभेद है वर्तमान में, दो मुख्य 64 बिट वातावरण के "शाखाओं" मौजूद हैं, IL32P64 (क्या Win64 का उपयोग करता है - पूर्णांक और लंबे समय से कर रहे हैं int32_t, केवल uintptr_t/शून्य * uint64_t है, से आकार के पूर्णांक के संदर्भ में बात करते हैं) और एलपी 64 (जो यूएन * एक्स का उपयोग करता है - int int32_t है, int int64_t है और uintptr_t/void * uint64_t है), लेकिन अलग-अलग संरेखण नियमों के "उपखंड" भी हैं - कुछ वातावरण मानते हैं अपने संबंधित आकारों पर लंबे, फ्लोट या डबल संरेखित करें, जबकि अन्य मानते हैं कि वे चार बाइट्स के गुणकों पर संरेखित हैं। 32 बिट लिनक्स में, वे सभी चार बाइट्स पर संरेखित करते हैं, जबकि 64 बिट लिनक्स में, फ्लोट आठ-बाइट गुणक पर चार, लंबे और डबल पर संरेखित होते हैं। इन नियमों का नतीजा यह है कि कई मामलों में, बिथ आकार (संरचना {...}) और संरचना/कक्षा के सदस्यों का ऑफसेट 32 बिट और 64 बिट वातावरण के बीच अलग है, भले ही डेटा प्रकार की घोषणा पूरी तरह से समान हो। सरणी/वेक्टर आवंटन को प्रभावित करने से परे, ये समस्याएं डेटा/आउटपुट में डेटा को भी प्रभावित करती हैं। फाइलों के माध्यम से - यदि एक 32 बिट ऐप लिखता है उदा। संरचना {चार ए; int बी; चार सी, लंबे डी; डबल ई} एक फ़ाइल में जो उसी ऐप को 64 बिट पढ़ने के लिए पुन: संकलित करता है, नतीजा यह नहीं होगा कि इसके लिए क्या उम्मीद की जा रही है। केवल दिए गए उदाहरण केवल भाषा प्राइमेटिव्स (char, int, long आदि) के बारे में हैं, लेकिन निश्चित रूप से सभी प्रकार के प्लेटफॉर्म-निर्भर/रनटाइम लाइब्रेरी डेटा प्रकारों को प्रभावित करते हैं, चाहे आकार_टी, ऑफ_टी, टाइम_टी, हैंडल, अनिवार्य रूप से कोई भी नॉनट्रिविअल स्ट्रक्चर/यूनियन/वर्ग ... - इसलिए यहां त्रुटि के लिए जगह बड़ी है,
और फिर निचले स्तर के मतभेद हैं, जो खेल में आते हैं जैसे हाथ से अनुकूलित असेंबली (एसएसई/एसएसई 2/...) के लिए; 32 बिट और 64 बिट में अलग-अलग (संख्याओं) रजिस्ट्रार हैं, नियमों को पार करने के विभिन्न तर्क; यह सब दृढ़ता से प्रभावित करता है कि इस तरह के अनुकूलन कैसे प्रदर्शन करते हैं और यह बहुत संभावना है कि उदा। एसएसई 2 कोड जो 32 बिट मोड में सर्वश्रेष्ठ प्रदर्शन देता है उसे सर्वश्रेष्ठ प्रदर्शन 64 बिट मोड देने के लिए पुनः लिखने/बढ़ाने की आवश्यकता होगी।
कोड डिज़ाइन बाधाएं भी हैं जो 32 बिट और 64 बिट के लिए बहुत अलग हैं, खासकर स्मृति आवंटन/प्रबंधन के आसपास; एक आवेदन जिसे सावधानीपूर्वक "32 बिट में प्राप्त किए जा सकने वाले मेम से नरक को अधिकतम करने" के लिए कोड किया गया है, इसमें जटिल तर्क होगा कि कैसे/कब आवंटित/मुक्त मेमोरी, मेमोरी-मैप किए गए फ़ाइल उपयोग, आंतरिक कैशिंग आदि - जिनमें से अधिकतर 64 बिट में हानिकारक हो जहां आप "उपलब्ध" विशाल उपलब्ध पता स्थान का लाभ उठा सकते हैं। ऐसा ऐप 64 बिट के लिए ठीक से पुनः संकलित हो सकता है, लेकिन कुछ "प्राचीन सरल बहिष्कृत संस्करण" से भी बदतर हो सकता है जिसमें अधिकतम अधिकतम-32 बिट पेफोल ऑप्टिमाइज़ेशन नहीं थे।
तो, आखिरकार, यह संवर्द्धन/लाभ के बारे में भी है, और जहां कहीं अधिक काम, आंशिक रूप से प्रोग्रामिंग में, आंशिक रूप से डिजाइन/आवश्यकताओं में आता है। भले ही आपका ऐप 32 बिट और 64 बिट वातावरण दोनों पर साफ-सुथरा हो और दोनों पर सत्यापित हो , क्या यह वास्तव में 64 बिट से लाभान्वित है? क्या 64 बिट में इसे और अधिक तेज़ी से चलाने के लिए कोड तर्क में किए जा सकते हैं? क्या आप 32 बिट पिछड़े संगतता को तोड़ने के बिना उन परिवर्तनों को कर सकते हैं? 32 बिट लक्ष्य पर नकारात्मक प्रभाव के बिना? वृद्धि कहाँ होगी, और आप कितना लाभ प्राप्त कर सकते हैं? एक बड़ी वाणिज्यिक परियोजना के लिए, इन सवालों के जवाब अक्सर रोडमैप पर महत्वपूर्ण मार्कर हैं क्योंकि आपका शुरुआती बिंदु कुछ मौजूदा "मनी मेकर" है ...
awsome anwser :) बस जो मैं देख रहा था :) –
@FredrikBostonWestman तो आपको इसे स्वीकार करना चाहिए! – gsamaras