"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > تخطيط الذاكرة في C

تخطيط الذاكرة في C

تم النشر بتاريخ 2024-08-17
تصفح:896

مقدمة

يشير تخطيط الذاكرة إلى كيفية تنظيم وتنظيم ذاكرة الكمبيوتر. فهو يحدد كيفية تقسيم الذاكرة واستخدامها من قبل مكونات النظام المختلفة.

يعد هذا أمرًا بالغ الأهمية في لغة C لأنه يؤثر بشكل مباشر على كيفية تخزين المتغيرات والوظائف وهياكل البيانات والوصول إليها أثناء التنفيذ.

في هذه المقالة، سنتعرف على الجوانب الأساسية لتخطيط الذاكرة في لغة C.

القطاعات في تخطيط الذاكرة في لغة C

يتكون تخطيط الذاكرة في لغة C من مقاطع مختلفة، وفيما يلي المقاطع؛

  1. مقطع النص (الكود).
  2. قطاع البيانات.
  3. كومة.
  4. كومة.

الرسم البياني أدناه يصور تخطيط ذاكرة لغة C.

Diagram of C’s memory layout.
الآن دعونا نناقش الأجزاء بالتفصيل.

مقطع النص (الرمز).

مقطع النص عبارة عن منطقة من الذاكرة في برنامج C تقوم بتخزين تعليمات كود الجهاز المترجمة. تشكل هذه التعليمات المنطق القابل للتنفيذ للبرنامج وهي المسؤولة عن تحديد سلوكه.

إليك مثال بسيط لتوضيح مفهوم مقطع النص في برنامج C:

#include 

int main() {
    int x = 5;
    int y = 10;
    int sum;

    sum = x   y;
    printf("The sum of %d and %d is %d\n", x, y, sum);

    return 0;
}

يقوم المترجم بتحويل كود المصدر إلى كود الجهاز عند تجميع هذا البرنامج. يشكل رمز الجهاز هذا منطق البرنامج وسلوكه ويتم تخزينه في مقطع النص.

بينما لا يمكننا رؤية رمز الجهاز مباشرة. يمكننا أن نفهم أن مقطع النص يحتوي على التعليمات المجمعة.

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

شريحة البيانات

ينقسم قطاع البيانات إلى قسمين:

  • قطاع البيانات المهيأ
  • قطاع البيانات غير المهيأ

قطاع البيانات المهيئ

يتكون مقطع البيانات الذي تمت تهيئته من متغيرات عالمية، وخارجية، وثابتة (محلية وعالمية)، ومتغيرات عالمية ثابتة تمت تهيئتها مسبقًا. يحتوي مقطع البيانات الذي تمت تهيئته على قسمين، القسم للقراءة فقط وللقراءة والكتابة.

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

إليك مثال يوضح المتغيرات المخزنة في مقطع البيانات الذي تم تهيئته، في قسمي القراءة والكتابة والقراءة فقط:

#include 

// Global variable (read-write section)
int globalVar = 10;

// External variable declaration (read-write section)
extern int externVar;

// Static global variable (read-write section)
static int staticGlobalVar = 20;

// Constant global variable (read-only section)
const int constGlobalVar = 30;

int main() {
    globalVar  = 5;
    staticGlobalVar  = 10;

    printf("Global variable: %d\n", globalVar);
    printf("Extern variable: %d\n", externVar);  // Assuming externVar is defined in another file
    printf("Static global variable: %d\n", staticGlobalVar);
    printf("Constant global variable: %d\n", constGlobalVar);

    return 0;
}

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

قطاع البيانات غير المهيأ

يتكون مقطع البيانات غير المهيأ والمعروف أيضًا باسم مقطع BSS (الحظر الذي يبدأ بالرمز) من متغيرات عالمية وخارجية وثابتة (محلية وعالمية) غير مهيأة.

تتم تهيئة هذه المتغيرات إلى الصفر افتراضيًا قبل تنفيذ البرنامج. لديهم أذونات القراءة والكتابة. وبالتالي السماح لهم بالقراءة والكتابة إليهم أثناء تنفيذ البرنامج.

مثال:

#include 

// Uninitialized global variable (goes to the BSS segment)
int globalVar;

// Uninitialized static global variable (also goes to the BSS segment)
static int staticGlobalVar;

int main() {
    // Uninitialized local static variable (goes to the BSS segment)
    static int staticLocalVar;

    printf("Uninitialized Global Variable: %d\n", globalVar);
    printf("Uninitialized Static Global Variable: %d\n", staticGlobalVar);
    printf("Uninitialized Static Local Variable: %d\n", staticLocalVar);
    return 0;
}

في هذا البرنامج، ستحتوي المتغيرات غير المهيأة على قيم صفرية أو فارغة بشكل افتراضي. ويرجع ذلك إلى التهيئة التلقائية من قبل المترجم. يوضح هذا سلوك المتغيرات المخزنة في مقطع BSS.

كومة

الكومة هي منطقة من الذاكرة تستخدم لتخصيص الذاكرة الديناميكية أثناء وقت التشغيل. وهذا يسمح بتخصيص الذاكرة وتحريرها حسب الحاجة أثناء تنفيذ البرنامج. يتم استخدام وظائف مثل malloc()، calloc()، realloc()، وfree() لتخصيص الذاكرة وإلغاء تخصيصها في الكومة. الكومة متاحة لجميع أجزاء البرنامج.

مثال:

#include 
#include 

int main() {
    // Dynamically allocate memory for an integer variable on the heap
    int *ptr = (int *)malloc(sizeof(int));

    return 0;
    }

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

كومة

الوظيفة الأساسية لقطاعات المكدس هي إدارة استدعاءات الوظائف وتخزين المتغيرات المحلية. يعد هذا الجزء ضروريًا في تخطيط ذاكرة البرنامج، لأنه يتحكم في التدفق داخل البرنامج. تعتمد المكدس بنية آخر ما يدخل أولاً يخرج أولاً (LIFO)، مما يعني أنه تتم إزالة أحدث البيانات المضافة أولاً. وهذا يجعل المكدس فعالاً للغاية لإدارة المتغيرات المحلية واستدعاءات الوظائف المتداخلة.

مثال:

#include 

void functionA(int n) {
    int a = n   1; // Local variable
    printf("In functionA, a = %d\n", a);
}

void functionB() {
    int b = 10; // Local variable
    printf("In functionB, b = %d\n", b);
    functionA(b); // Call to functionA
}

int main() {
    int x = 20; // Local variable
    printf("In main, x = %d\n", x);
    functionB(); // Call to functionB
    return 0;
}

يشرح الكود كيفية تخزين إطارات المكدس للمتغيرات المحلية. يتم إنشاء إطارات مكدسة جديدة بواسطة استدعاءات الوظائف ويتم التخلص منها عند عودة الوظائف. تسهل تعليمات printf تصور قيم المتغيرات المحلية لكل وظيفة. يتبع تدفق التنفيذ الاستدعاءات والإرجاعات من الوظائف.

خاتمة

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

لا تتردد في المتابعة والتعليق وترك التصفيق. برمجة سعيدة!

دعونا نتواصل على LinkedIn.

بيان الافراج تم نشر هذه المقالة على: https://dev.to/hyoukarh/memory-layout-in-c-399a إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3