سؤال

وأنا أتساءل لماذا النوعين التاليين

struct {
    double re[2];
};

و

double re[2];

ولها نفس الحجم في C؟ لا يضيف البنية قليلا من حجم النفقات العامة؟

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

المحلول

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

نصائح أخرى

وليس إذا كان يمكن أن تساعد في ذلك - لا. C يتجنب النفقات العامة مثل الطاعون. وعلى وجه التحديد، فإنه يتجنب النفقات العامة في هذا السياق.

إذا كنت تستخدم بنية مختلفة، قد تشاهد الفرق:

struct space_filled
{
    char       part0;
    double     part1;
};

إذا جهازك تتطلب double إلى الانحياز على حد 8 بايت (وsizeof(double) == 8، وهو أمر طبيعي ولكن ليس بتكليف من قياسي)، وبعد ذلك سوف تجد أن هيكل يحتل 16 بايت.

وكلا، ليس لديها البنية لإضافة أي شيء. وخلافا للجافا أو .NET، حيث الطبقات (والبنيات) لديها مجموعة من المسؤوليات الأخرى، C و C ++، فهي ببساطة العبوات المستخدمة لعقد عدد من أعضاء البيانات. في C ++، فإنها قد تضطر إلى تخزين vtable لحل تدعو دالة الظاهري إن وجدت موجودة، ولكن بشكل عام، لا، البنية نفسها ليس لديها في سماء المنطقة.

والاستثناء الوحيد هو هذا:

typedef struct {} empty;
assert(sizeof(empty) > 0);

وحجم وبنية فارغة سوف <م> لا يكون صفرا. A البنية لا بد أن يكون <م> بعض حجم صفرية لأن كل كائن لا بد أن يكون عنوان فريد. (وإلا فإنك لن تكون قادرا على خلق مجموعة من هذه البنيات)

ولا. البنية لا يضيف أي حجم، أو لديك أي النفقات العامة في C المترجمة.

ومن طبقة من الجملة التي يتطلب عملا إضافيا من قبل المجمع، ولكن لا يوجد لديه النفقات العامة في وقت التشغيل.

وC هو غاية "المجردة" اللغة، وهذا يعني أن لا شيء هناك إلا إذا لزم الأمر. لذا اسأل نفسك، "ما فوق لا لبنية تتطلب؟"، وأنك لن تجد أي.

لا هو لا.

وهذا واحد من النقاط الجيدة من البنيات (لماذا كانت مفيدة جدا في TCP المدرسة القديمة / برمجة IP).

وانها وسيلة جيدة لتمثيل تخطيط الذاكرة / العازلة.

وأي نوع البنية في C فقط بالتسلسل تخطيط أعضاء في الذاكرة

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