برنامه نویسی

چیدمان حافظه در انجمن C – DEV

Summarize this content to 400 words in Persian Lang

معرفی

چیدمان حافظه به نحوه سازماندهی و ساختار حافظه کامپیوتر اشاره دارد. نحوه تقسیم و استفاده از حافظه توسط اجزای مختلف سیستم را مشخص می کند.

این در C بسیار مهم است زیرا مستقیماً بر نحوه ذخیره و دسترسی متغیرها، توابع و ساختارهای داده در حین اجرا تأثیر می گذارد.

در این مقاله، ما در مورد جنبه های اساسی چیدمان حافظه در C یاد خواهیم گرفت.

بخش ها در چیدمان حافظه C

چیدمان حافظه در C از بخش های مختلفی تشکیل شده است که در زیر بخش ها آمده است.

بخش متن (کد).
بخش داده
پشته.
پشته.

نمودار زیر چیدمان حافظه C را نشان می دهد.

حالا بیایید بخش ها را با جزئیات بحث کنیم.

بخش متن (کد).

بخش متن ناحیه ای از حافظه در برنامه 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 را نشان می دهد.

پشته

Heap ناحیه ای از حافظه است که برای تخصیص حافظه پویا در طول زمان اجرا استفاده می شود. این امکان تخصیص و آزادسازی حافظه را در حین اجرای برنامه فراهم می کند. کارکردهایی مانند malloc()، calloc()، realloc()، و رایگان() برای تخصیص حافظه و توزیع در پشته استفاده می شود. Heap در تمام قسمت های برنامه قابل دسترسی است.

مثال:

#include
#include

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

return 0;
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این قطعه کد، استفاده ساده از تخصیص حافظه پویا در C را نشان می دهد. توجه را به مراحل مربوط به درخواست حافظه، مقداردهی اولیه اشاره گر به آن حافظه و مدیریت صحیح حافظه برای جلوگیری از نشتی جلب می کند. در حالی که مدیریت خطا و تخصیص حافظه در این مثال گنجانده نشده است، اینها اجزای حیاتی کار با حافظه پویا در کاربردهای عملی هستند.

پشته

تابع اصلی stack segments مدیریت فراخوانی تابع و ذخیره متغیرهای محلی است. این بخش در چیدمان حافظه یک برنامه بسیار مهم است، زیرا جریان درون یک برنامه را کنترل می کند. پشته از ساختار Last In, First Out (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 می توانند با تسلط بر این مفاهیم، ​​تکنیک های کدنویسی خود را بهبود بخشند و درک بهتری از نحوه تعامل برنامه هایشان با حافظه به دست آورند. درک چیدمان حافظه یک مهارت حیاتی در جعبه ابزار برنامه نویسی شماست، چه در حال بهینه سازی عملکرد یا عیب یابی یک مشکل پیچیده باشید.

با خیال راحت دنبال کنید، نظر بدهید و کف بزنید. کد نویسی مبارک!

بیایید در لینکدین وصل شویم.

معرفی

چیدمان حافظه به نحوه سازماندهی و ساختار حافظه کامپیوتر اشاره دارد. نحوه تقسیم و استفاده از حافظه توسط اجزای مختلف سیستم را مشخص می کند.

این در C بسیار مهم است زیرا مستقیماً بر نحوه ذخیره و دسترسی متغیرها، توابع و ساختارهای داده در حین اجرا تأثیر می گذارد.

در این مقاله، ما در مورد جنبه های اساسی چیدمان حافظه در C یاد خواهیم گرفت.

بخش ها در چیدمان حافظه C

چیدمان حافظه در C از بخش های مختلفی تشکیل شده است که در زیر بخش ها آمده است.

  1. بخش متن (کد).
  2. بخش داده
  3. پشته.
  4. پشته.

نمودار زیر چیدمان حافظه C را نشان می دهد.

نمودار چیدمان حافظه C.
حالا بیایید بخش ها را با جزئیات بحث کنیم.

بخش متن (کد).

بخش متن ناحیه ای از حافظه در برنامه 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 را نشان می دهد.

پشته

Heap ناحیه ای از حافظه است که برای تخصیص حافظه پویا در طول زمان اجرا استفاده می شود. این امکان تخصیص و آزادسازی حافظه را در حین اجرای برنامه فراهم می کند. کارکردهایی مانند malloc()، calloc()، realloc()، و رایگان() برای تخصیص حافظه و توزیع در پشته استفاده می شود. Heap در تمام قسمت های برنامه قابل دسترسی است.

مثال:

#include 
#include 

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

    return 0;
    }
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این قطعه کد، استفاده ساده از تخصیص حافظه پویا در C را نشان می دهد. توجه را به مراحل مربوط به درخواست حافظه، مقداردهی اولیه اشاره گر به آن حافظه و مدیریت صحیح حافظه برای جلوگیری از نشتی جلب می کند. در حالی که مدیریت خطا و تخصیص حافظه در این مثال گنجانده نشده است، اینها اجزای حیاتی کار با حافظه پویا در کاربردهای عملی هستند.

پشته

تابع اصلی stack segments مدیریت فراخوانی تابع و ذخیره متغیرهای محلی است. این بخش در چیدمان حافظه یک برنامه بسیار مهم است، زیرا جریان درون یک برنامه را کنترل می کند. پشته از ساختار Last In, First Out (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 می توانند با تسلط بر این مفاهیم، ​​تکنیک های کدنویسی خود را بهبود بخشند و درک بهتری از نحوه تعامل برنامه هایشان با حافظه به دست آورند. درک چیدمان حافظه یک مهارت حیاتی در جعبه ابزار برنامه نویسی شماست، چه در حال بهینه سازی عملکرد یا عیب یابی یک مشکل پیچیده باشید.

با خیال راحت دنبال کنید، نظر بدهید و کف بزنید. کد نویسی مبارک!

بیایید در لینکدین وصل شویم.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا