בעיה ב-malloc - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

בעיה ב-malloc


borg

Recommended Posts

א. צריך ליצור פונקציה aligned_malloc המקצה מקום בזיכרון בגודל size. אבל, שהכתובת שלו תתחלק ב-16, כלומר תהיה כפולה של 16.

ב. צריך ליצור פונקציה aligned_free המשחררת את כל הבלוק שהוקצה (לא רק את הבלוק בגודל size)!

ג. אסור להחזיר פוינטר לבלוק שקטן מ-size.

ד. יש לפתור את הבעיה בשפת C תוך שימוש בפונקציות הספריה malloc ו-free.

מה דעתכם על הפתרון הבא:

#include <malloc.h>

void *aligned_malloc( int sz )
{
//first we allocate memory using malloc. We allocate more than required to have spare
//for aligning to 16 byte boundary and to keep a record with alignment info
void *p = malloc( sz + 16 + 4 );
//check the returned pointer to see if somehow we are aligned or not.
//note that we spare 4 bytes (longword) in the beginning of the block for the
//alignment info.
int residue = ((long)p+4)%16;
//if we are not aligned, we offset the pointer with offset required to make it aligned
//if we are aligned we offset by a block of 16, no harm, better than doing if()
//the extra 4 is to reserve a space for the alignment info (used by the aligned_free())
(long)p += 4 + (16 - residue);
*(int *)((char *)p-4) = (int)residue; //keep the alignment info here
return( p );
}

void aligned_free( void *p )
{
void *p_to_free;
int residue = *(int *)((char *)p-4); //get the alignment info
//restore original p, knowing we offseted it in order to align
p_to_free = (void*)((long)p - 4 - (16 - residue));
free( p_to_free ); //and accordingly find original malloc returned pointer
}


void main( void )
{
char *buff1 = (char *)aligned_malloc( 5 );
char *buff2 = (char *)aligned_malloc( 5 );
aligned_free( buff2 );
aligned_free( buff1 );
}

האם הפתרון הזה עובד?

האם הפתרון הזה יעיל?

האם יש פתרון יותר פשוט/יעיל/קריא?

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

;)

איך אני אמור למצוא פונקציה כזו בגוגל? :s05:

מה דעתך על המימוש? יש לך הצעות להפשטה/ייעול?

פשוט מאוד, תרשום בדפדפן את הכתובת www.google.com

אחרי זה יש לך באמצע משהו של חיפוש, תרשום שם aligned_malloc

אתה תקבל מספר תוצאות שמראות לך איך לכתוב את הפונקציה בצורה די טובה. תבחר את הראשונה. תקרא. תלמד.

לא היה מסובך נכון ?

וסתם יש דברים זועקים אצלך כמו שאתה לא בודק אם ה MALLOC נכשל וממשיך, ולא משתמש ב DEFINE וכו' (אבל אלו דברים צדדים).

וד"א נראה שזה בסדר.

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

אחלה הסבר על השימוש בגוגל! :xyxthumbs:

הבעיה שלי היתה שהם רצו aligned_malloc ל-16, ולא חשבתי שאני אמצא משהו כזה בגוגל. להפתעתי, מצאתי בגוגל את פונקציה כללית (לא רק ל-16) בתוצאה השלישית.

להלן הפתרון:

/* align_size has to be a power of two !! */
void *aligned_malloc(size_t size, size_t align_size) {

char *ptr,*ptr2,*aligned_ptr;
int align_mask = align_size - 1;

ptr=(char *)malloc(size + align_size + sizeof(int));
if(ptr==NULL) return(NULL);

ptr2 = ptr + sizeof(int);
aligned_ptr = ptr2 + (align_size - ((size_t)ptr2 & align_mask));


ptr2 = aligned_ptr - sizeof(int);
*((int *)ptr2)=(int)(aligned_ptr - ptr);

return(aligned_ptr);
}

void aligned_free(void *ptr) {

int *ptr2=(int *)ptr - 1;
ptr -= *ptr2;
free(ptr);
}

הקוד הנ"ל הוא הקוד הכי פשוט ויעיל, או שיש מקום לשיפורים? ::)

אתה צודק לגבי הבדיקה של ה-malloc.

בנוגע ל-DEFINE, הדרישה היתה למשהו ספיציפי. אבל, DEFINE זה באמת יותר יפה.

דרך אגב, הדרישה היא שהפונקציה תעבור קומפילציה ותרוץ מהדף (חבל שאין לי קומפיילר בעט). :-\

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

כן, מה לעשות, כשרוצים להתאכזר אין גבול... לנו נתנו באיזה מבחן קוד ב C++ על דף עם כל מני טריקים מלוכלכים, ואנחנו היינו בתפקיד קומפיילר, למצוא את כל ה ERRORS שיש בקוד (משהו הזוי), ואז לתקן את זה וכו'... (שכמובן זה רק שליש מהבחינה).

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

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

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

לא נראה לי שבראיונות עבודה מגיעים לכאלו דברים פדנטים.

תתפלא! :hat:

חשבתי על המצאה גאונית. כשם שיש עט Quickionary שמתרגם מלים מאנגלית לעברית, אני צריך עט שמהדרת קוד ב-C (גירסה משופרת של העט מאפשרת לבחור ביו מספר שפות תכנות). אני קורא להמצאה שלי Quickpilation! עכשיו רק צריך למצוא מישהו שירים את הכפפה וייצר את המוצר הזה. אני סבור שיש לו קהל יעד פוטנציאלי לא קטן.

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

ארכיון

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

×
  • צור חדש...