النقاط التي يجب مراعاتها عند كتابة التعليمات البرمجية التي يمكن حملها لكل من معماريات 32 و64 بت

StackOverflow https://stackoverflow.com/questions/2254222

  •  20-09-2019
  •  | 
  •  

سؤال

ما هي النقاط التي يجب مراعاتها أثناء كتابة التعليمات البرمجية التي يجب أن تكون محمولة على الأجهزة 32 بت و64 بت؟

بالتفكير أكثر في هذا الأمر، أشعر أنه إذا كان بإمكانك إضافة خبرتك فيما يتعلق بالمشكلات التي تواجهها، فإن ذلك من شأنه أن يساعد.

إضافة إلى ذلك، واجهت مشكلة ذات مرة بسبب فقدان نموذج أولي لوظيفة كانت تعيد مؤشرًا.عندما قمت بنقل نفس الشيء إلى جهاز 64 بت، تعطل الكود ولم يكن لدي أدنى فكرة عن السبب لبعض الوقت، وأدركت لاحقًا أن جميع النماذج الأولية المفقودة من المفترض أن ترجع int مسببة المشكلة.

أي أمثلة من هذا القبيل يمكن أن تساعد.

يحرر:إضافة إلى ويكي المجتمع.

هل كانت مفيدة؟

المحلول

مسكتك:

  1. يعد إرسال المؤشرات إلى الأنواع الصحيحة أمرًا خطيرًا
  2. يمكن أن تتغير أحجام بنية البيانات
  3. احترس من تمديد التوقيع
  4. واجهة برمجة تطبيقات مختلفة؟

بعض النصائح والحيل التي وجدتها مفيدة:

  1. احصل على نوع عدد صحيح بالحجم الأصلي (من رأس أو typedef الخاصة بك) واستخدمها عندما يكون لديك متغيرات لا تهتم بالحجم.
  2. استخدم أنواع المتغيرات الصريحة حيثما أمكن ذلك (u_int64_t، int_32_t، وما إلى ذلك)

نصائح أخرى

  • قد يكون لبعض الأنواع المتكاملة أحجام مختلفة
  • المؤشرات ذات أطوال مختلفة
  • حشوة الهيكل
  • تنسيق

في نظام التشغيل Windows، لا يوجد سوى اصطلاح الاتصال على الإصدار x64 بدلاً من الاتصال المتعدد الموجود على جهاز x32 العادي.

تصبح الأمور أكثر غموضًا عندما يكون لديك بعض المكونات 32 بت وبعضها 64 بت.في نظام التشغيل Windows، انتهى بي الأمر بكتابة خدمة COM لحملهم على التحدث.

ودفع المؤشرات إلى المكدس يستغرق ضعف مساحة كبيرة. لا يمكن تغيير حجم المكدس بين إصدارات نظام التشغيل الرغم من ذلك، مما تسبب في التعليمات البرمجية التي تدير غرامة في 32 بت لظروف غامضة تفشل عند تصنيف وتشغيل دون تغيير على 64 بت. لا تسألني كيف أعرف أن هذا.

وsizeof (دولي) القوة! = sizeof (باطل *)

والمحاذاة. من الممكن أن احتياجات التحالفات قد تتغير. وهذا يمكن أن كشف الخلل حيث كنت قد اساءة معاملة الأشياء التي كان ينبغي أن تتماشى لكن الانحياز عن طريق الصدفة فقط في 32 بت (أو على المعالج الذي لا يهمه)

وأميل تمرير 0 إلى varargs إذا كان المتلقي يتوقع مؤشر. هذا هو المؤلم في C ++ حيث تعرف المشروعات الإنمائية والدهاء أن 0 هو مؤشر لاغية صالح. وهناك ديف C وعادة ما يستخدم NULL لذلك ربما كنت موافق

والكتابة الآلية الاختبارات وتشغيل بشكل منتظم على كل المنابر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top