هل الطبقة/البنية أعضاء تحصل دائما على خلق في الذاكرة في النظام كانوا أعلن ؟

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

  •  07-07-2019
  •  | 
  •  

سؤال

هذا هو السؤال الذي أثار من قبل روب ووكر's الإجابة هنا.

لنفترض أعلن فئة/البنية مثل ذلك:

struct
{ 
    char A;
    int B;
    char C;
    int D;
};

أنه من الأسلم أن نفترض أن هؤلاء الأعضاء سوف يعلن في بالضبط هذا النظام في الذاكرة أو أن هذه مترجم تعتمد الشيء ؟ أنا أسأل لأنني قد افترض دائما أن المترجم تستطيع أن تفعل ما تريد معهم.

هذا يقودنا إلى السؤال التالي.إذا كان المثال أعلاه الأسباب الذاكرة مشكلات التوافق, لماذا يمكن أن المترجم ليس فقط أن تتحول إلى شيء مثل هذا ضمنا:

struct
{ 
    char A;
    char C;
    int B;
    int D;
};

(أنا في المقام الأول يسأل عن C++, ولكن سأكون مهتما لسماع ج الجواب كذلك)

مواضيع ذات صلة

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

المحلول

C99 §6.7.2.1 شرط 13 دولة:

داخل بنية الكائن ، غير بت الميدانية أعضاء الوحدات في الذي بت الحقول الموجودة لديك عناوين أن الزيادة في الترتيب الذي يتم الإعلان عنها.

ويذهب إلى القول أكثر قليلا حول الحشو و العناوين.على C89 ما يعادل قسم §6.5.2.1.

C++ هي قليلا أكثر تعقيدا.في عام 1998 و 2003 معايير §9.2 البند 12 (الفقرة 15 في C++11):

Nonstatic بيانات أعضاء (غير الاتحاد) فئة أعلن دون التدخل الوصول محدد هي المخصصة لذلك في وقت لاحق أعضاء عناوين أعلى ضمن الدرجة الكائن.من تخصيص nonstatic أعضاء البيانات مفصولة الوصول محدد غير محدد (11.1).تنفيذ المحاذاة متطلبات قد تسبب اثنين المجاورة أعضاء لا يمكن تخصيص مباشرة بعد الآخر ؛ لذلك قد متطلبات مساحة لإدارة وظائف افتراضية (10.3) و الظاهري قاعدة الطبقات (10.1).

نصائح أخرى

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

أنظر أيضا لماذا لا تقوم دول مجلس التعاون الخليجي بتحسين الهياكل؟.


يبدو أن هذه الإجابة قديمة إلى حد ما بالنسبة لـ C++.تتعلم شيئا ما كل يوم.شكرا آيب، نيمانيا.

في الأساس، يمكنك الاعتماد على ذلك فقط للفصول ذات الامتداد تخطيط قياسي.بالمعنى الدقيق للكلمة، التخطيط القياسي هو شيء C++ 0x، لكنه في الواقع مجرد توحيد الممارسات الحالية/

لا أستطيع التحدث عن لغة C++، ولكن في لغة C يتم ضمان أن يكون الترتيب هو نفس الترتيب في الذاكرة كما هو معلن في البنية.

بصرف النظر عن الحشو للمحاذاة، لا يسمح أي مترجم (على حد علمي) بتحسين البنية لـ C أو C++.لا أستطيع التحدث عن فئات C++، لأنها قد تكون وحشًا آخر تمامًا.

ضع في اعتبارك أن برنامجك يتفاعل مع رمز النظام/المكتبة على نظام التشغيل Windows ولكنك تريد استخدام دول مجلس التعاون الخليجي.يجب عليك التحقق من أن دول مجلس التعاون الخليجي تستخدم خوارزمية متطابقة لتحسين التخطيط بحيث يتم تعبئة جميع بنياتك بشكل صحيح قبل إرسالها إلى التعليمات البرمجية المترجمة من MS.

أثناء تصفح المواضيع ذات الصلة على اليمين، نظرت إلى هذا السؤال.أعتقد أن هذه قد تكون حالة زاوية مثيرة للاهتمام عند التفكير في هذه المشكلات (ما لم تكن أكثر شيوعًا مما أدرك).

لإعادة الصياغة، إذا كان لديك بنية في لغة C تبدو كالتالي:

struct foo{};

وفئتها الفرعية كما هو الحال في C++ (باستخدام وحدة ترجمة منفصلة):

extern "C" foo;
struct bar: public foo{};

ثم لن تكون محاذاة الذاكرة هي نفسها بالضرورة للأسباب aib يذكر (حتى بين المترجمين من نفس البائع).

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