Распределение стековой памяти переменных в переполнении стека

Как компилятор c ++ организует переменные, которые инициализируются в функции, для их хранения, чтобы компьютер нашел их самым быстрым способом?

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

Например:

int main()
{
float a;
int b;
char c;
double d;
}

Это должно занимать больше памяти, чем показано ниже, из-за того, как компилятор c ++ хранит в памяти.

Разумеется, точные биты одинаковы, но они должны храниться в более эффективном порядке в примере ниже. Где в памяти эти переменные будут храниться компилятором в следующем примере? Насколько я понял, переменная всегда хранится в блоке так, что (logical number) % (number of bytes the datatype) = 0

int main()
{
char c;
int b;
float a;
double d;
}

1

Решение

Это должно занимать больше памяти, чем приведенное ниже, из-за способа
компилятор c ++ хранится в памяти.

Не совсем, стековая память, используемая обеими функциями, должна быть одинаковой для любой вменяемый оптимизирующий компилятор… Современные компиляторы C ++ действительно агрессивны при определенных оптимизациях.

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

Я думаю, вы пытаетесь поговорить о structс и classгде расположение памяти и порядок адресов переменных как заявлено.

Как компилятор c ++ организует переменные, которые инициализируются
в функции, чтобы сохранить их, чтобы компьютер нашел их самыми быстрыми
путь?

На практике каждый доступ к автоматической переменной в C ++ представляет собой простое смещение указателя относительно указатель стека1 (кроме переменных компилятор помещал прямо в регистр). Кроме того, чтобы ускорить процесс до таких автоматических переменных (без порядка):


1: Даже указатель стека выровненный большинством компиляторов.

0

Другие решения

В стандарте C ++ нет требований для автоматический (что ты назвал стек) переменные, которые должны быть расположены в определенном порядке или месте (до тех пор, пока выравнивание требования выполнены).

3

Регистры и оптимизации.
Наиболее эффективный доступ к переменным — их устранение. Многие компиляторы будут оптимизировать переменные, которые не используются.

Если переменная используется локально, компилятор может решить поместить переменную в регистр. Регистры являются наиболее эффективным доступом для переменных.

Стек — это удобная структура данных для размещения локальных переменных. Компилятор может уничтожать переменные в стеке, изменяя указатель стека. Реализации, использующие стек, часто имеют указатель на вершину стека (где расположена следующая переменная). Распределение так же просто, как настройка указателя с помощью константы (что является арифметической операцией).

Помните, что нет требование что компилятор использует стек.

0

Спасибо за помощь, теперь я также нахожу не слишком плохое описание логики, которую я искал, для тех, кто заинтересован, я выложу ссылку здесь:
http://www.tenouk.com/Bufferoverflowc/Bufferoverflow2.html
http://www.tenouk.com/Bufferoverflowc/Bufferoverflow2a.html

0
По вопросам рекламы [email protected]