Как компилятор 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;
}
Это должно занимать больше памяти, чем приведенное ниже, из-за способа
компилятор c ++ хранится в памяти.
Не совсем, стековая память, используемая обеими функциями, должна быть одинаковой для любой вменяемый оптимизирующий компилятор… Современные компиляторы C ++ действительно агрессивны при определенных оптимизациях.
Кроме подходящих выравниваний, C ++ не устанавливает порядок адресов памяти для автоматических переменных в функциях. Хотя это правда, наблюдаемое поведение программы не должны быть изменены компилятором.
Я думаю, вы пытаетесь поговорить о struct
с и class
где расположение памяти и порядок адресов переменных как заявлено.
Как компилятор c ++ организует переменные, которые инициализируются
в функции, чтобы сохранить их, чтобы компьютер нашел их самыми быстрыми
путь?
На практике каждый доступ к автоматической переменной в C ++ представляет собой простое смещение указателя относительно указатель стека1 (кроме переменных компилятор помещал прямо в регистр). Кроме того, чтобы ускорить процесс до таких автоматических переменных (без порядка):
Компилятор устраняет мертвые переменные
Компилятор найдет лучший порядок для хранения каждого из них, чтобы удовлетворить подходящее выравнивание
Компилятор может использовать процессор зарегистрироваться напрямую в зависимости от того, что это Распределение регистра алгоритм решает
Компилятор может объединить некоторые переменные в вектор зарегистрируйтесь и используйте векторные инструкции, если это даст правильные результаты.
…и многое другое.
1: Даже указатель стека выровненный большинством компиляторов.
В стандарте C ++ нет требований для автоматический (что ты назвал стек) переменные, которые должны быть расположены в определенном порядке или месте (до тех пор, пока выравнивание требования выполнены).
Регистры и оптимизации.
Наиболее эффективный доступ к переменным — их устранение. Многие компиляторы будут оптимизировать переменные, которые не используются.
Если переменная используется локально, компилятор может решить поместить переменную в регистр. Регистры являются наиболее эффективным доступом для переменных.
Стек — это удобная структура данных для размещения локальных переменных. Компилятор может уничтожать переменные в стеке, изменяя указатель стека. Реализации, использующие стек, часто имеют указатель на вершину стека (где расположена следующая переменная). Распределение так же просто, как настройка указателя с помощью константы (что является арифметической операцией).
Помните, что нет требование что компилятор использует стек.
Спасибо за помощь, теперь я также нахожу не слишком плохое описание логики, которую я искал, для тех, кто заинтересован, я выложу ссылку здесь:
http://www.tenouk.com/Bufferoverflowc/Bufferoverflow2.html
http://www.tenouk.com/Bufferoverflowc/Bufferoverflow2a.html