Порядок размещения в стеке - PullRequest
0 голосов
/ 05 декабря 2009

Я использую этот код C

#define STACKSIZE       65536    

            char d[STACKSIZE];
            if (((int) &d[STACKSIZE-1]) - ((int) &d[0]) + 1 != STACKSIZE) {
                 Printf ("Stack space reservation failed\n");
                 Exit ();
            } 

            printf("Allocated from %d to %d so for %d bytes\n", &d, d+sizeof(d), sizeof(d));

            auto int a = 3;
            printf("Now the stack pointer is on %d\n",&a);

И я получаю в качестве вывода Выделено от -4262832 до -4197296, поэтому для 65536 байтов Теперь указатель стека включен -4262836

Это означает, что переменная «a» помещается в стек ПОСЛЕ массива. Но если я использую массив переменной длины (массив, длина которого устанавливается во время выполнения), я получаю противоположное поведение: a помещается в стек ДО массива.

Это код (тот же, но размер массива устанавливается во время выполнения)

 #define STACKSIZE       65536    

            int i = 1;
            char d[i*STACKSIZE];
            if (((int) &d[STACKSIZE-1]) - ((int) &d[0]) + 1 != STACKSIZE) {
                 Printf ("Stack space reservation failed\n");
                 Exit ();
            } 

            printf("Allocated from %d to %d so for %d bytes\n", &d, d+sizeof(d), sizeof(d));

            auto int a = 3;
            printf("Now the stack pointer is on %d\n",&a);

Это вывод

Выделено от -4262856 до -4197320, поэтому для 65536 байтов Теперь указатель стека включен -4197312

Так в чем же проблема? Как я могу решить это (используя массив переменной длины и помещая переменные в стек после него).

Спасибо!

1 Ответ

1 голос
/ 05 декабря 2009

Вы не можете. И вас не должно волновать, где находятся переменные, так или иначе, компилятор может их полностью оптимизировать.

Хотя это сильно зависит от системы, компиляторы, как правило, просто распределяют массивы переменного размера после всего остального, с тех пор это просто вопрос увеличения стека, чтобы создать ruum для массивов. Если компилятор помещает переменные после этой области, он должен получить к ним косвенный доступ через размеры массивов динамического размера.

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