C#|הקצאת זכרון דינמית. - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

C#|הקצאת זכרון דינמית.


eliom

Recommended Posts

יש לך שנמצא במחסנית (מיועד למשתנים פרימטיביים כמו INT) ויש לך שנמצא ב.... ערמה (??) - Heap.

המחסנית יותר מוגבלת מבחינת הגודל, והזכרון נערם שם לפי כללים מסויימים.

כשאתה מקצה בצורה דינאמית (באמצעות new למשל) אתה מקצה את הזכרון בערמה. הוא ישאר שם כל עוד תצביע עליו בצורה כל שהיא.

אתה יכול "להעביר" את ההצבעה ממקום למקום לשתף אותה בין אובייטקים וכו'.

כשעובדים עם מבני נתונים אתה לא תמיד יודע מראש כמה תצטרך, וכדי לא "לתפוס" את כל הזכרון, אתה יכול להקצות כל פעם קצת ולשם כך אתה משתמש בהקצאה דינמית .

שם לב שכל ניהול הזכרון ב-DOT NET קצת שונה מהתאוריה הקלאסית, כל יצירה של מחלקה היא למעשה הקצאה דינמית, ויש מחלקות שמבצעות הקצאות נוספות ברקע.

הזכרון שמוקצה על המחסנית לדוגמא, נכנסת לפונקציה והגדרת משתנה int i - כשתצא מהפונקציה הוא ימחק מייד. (במחסנית יש גם למשל את כתובת החזרה מהפוקנציה וכדי להגיע אליה מעיפים את כל מה שמעליה....)

קישור לתוכן
שתף באתרים אחרים

מתי שצריך, וכמה שצריך. השאלה שלך היא מאוד באוויר ולכן אין לה תשובה.

ב-#C לא ממש מתעסקים עם המושג שנקרא "הקצאה דינמית", משום שכל דבר שהוא לא משתנה פרימיטיבי בסיסי (int, bool, double...) מוקצה "דינמית", והתוכנה מנהלת עבורך את הזכרון.

איפה נתקלת במושג הזה בהקשר של #C?

קישור לתוכן
שתף באתרים אחרים

השאלה יותר רלוונטית להבין מה קורה מאחורי הקלעים של C#

מה שמאוד ברור למתכנתי C++ לא ממש מעניין מתכנתי DOTNET, למרות שפה ושם יש לזה גם חשיבות....

קישור לתוכן
שתף באתרים אחרים

  • 3 שבועות מאוחר יותר...

תקן אותי אם אני מבין אותך לא נכון - אתה רוצה להבין מה "דינאמי" בהקצאה דינאמית, ומתי משתמשים בה.

טוב, הרעיון (שמגיע כבר מ C), הוא שלא תמיד אתה יודע מראש כמה מקום אתה צריך.

למשל - אתה רוצה לכתוב תוכנה שתמיין ציוני מבחנים, אבל אתה לא יודע מראש - בזמן כתיבת התוכנה, כמה ציונים המשתמש ירצה להזין.

ולכן, אתה תשתמש במנגנון שהשפה נותנת (malloc ב C, ו new בשפות "חכמות יותר", כמו CPP ג'אוה ודוט.נט) כדי להקצות on-the-fly.

דוגמא להקצאה דינאמית vs הקצאה סטאטית, בשפת C:



#define ETHERYTHING_OK (0)
#define BAD_ALLOC (1)

#define NUMBER_OF_STUDENTS (17)

void do_some_magic_with_numbers(const int * grades);

void static_allocation_example(void)
{
unsigned int grades[NUMBER_OF_STUDENTS] = {0};
unsigned int i = 0;

for (i = 0; i < NUMBER_OF_STUDENTS; ++i) {
printf("Please enter the grade of the %d's student >>\t", i);
scanf("%d", &(grades[i]);
}
do_some_magic_with_numbers(grades);
}

void dynamic_allocation_example(void)
{
int retval = ETHERYTHING_OK;
unsigned int number_of_students = 0;
unsigned int * grades = NULL;
unsigned int i = 0;

printf("How many students do you have?\t");
scanf("%d", &number_of_students);

grades = calloc(number_of_students, sizeof(*grades));
if (NULL == grades) {
retval = BAD_ALLOC;
goto cleanup;
}

for (i = 0; i < number_of_students; ++i) {
printf("Please enter the grade of the %d's student >>\t", i);
scanf("%d", &(grades[i]);
}

do_some_magic_with_numbers(grades);

cleanup:
if (NULL != grades) {
free(grades);
greads = NULL;
}
return retval;
}

int main(void)
{
int retval = ETHERYTHING_OK;

static_allocation_example();

retval = dynamic_allocation_example();
if (ETHERYTHING_OK != retval) {
printf("Something bad happaned on malloc!\n");
}

return retval;
}
#include <stdio.h>

(למקרה שהקוד יוצא חרפש, צירפתי אותו להודעה).

תרגיש חופשי לשאול אם לא הבנת משהו!

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...