вопросы выделения и выравнивания стековой памяти - PullRequest
2 голосов
/ 17 декабря 2010

Вот пример программы и ее вывод.

typedef struct{
    char name[30];
    int empno;
    int sal;
}empd, * empdPtr;

int main(){
    int x = 1;
    char y = 2;
    int z = 3;
    empd e;
    empdPtr ep = &e;

    printf("sizeof ep = %d e = %d \n",sizeof(ep),sizeof(e));
    printf("Address of e = %u, ep = %u x = %u y = %u z = %u\n",&e,&ep,&x,&y,&z);
    printf("Address of e.name = %u e.empno = %u e.sal = %u \n",&e.name,&e.empno,&e.sal);
    return 0;
}

$ ./a.exe
sizeof ep = 4 e = 40
Address of e = 2289536, ep = 2289532 x = 2289596 y = 2289595 z = 2289588
Address of e.name = 2289536 e.empno = 2289568 e.sal = 2289572

Здесь разница между адресами & e и & z равна 52. Но размер (e) равен 40. Почему компилятор добавил еще 12 байтов, хотя 40 байтов достаточно?

1 Ответ

3 голосов
/ 17 декабря 2010

Компиляторы могут свободно размещать память по своему усмотрению, например, в интересах повышения производительности или того, что мотивирует генерацию кода.В ОС с очень ограниченными ресурсами компилятор может выбрать упаковку, а не выравнивание по скорости доступа.Возможно, некоторые неявные локальные переменные создаются компилятором.Есть много возможных причин для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...