1

Как компилятор C++ организует переменные, которые инициализируются в функции для их хранения, чтобы компьютер нашел их самым быстрым способом?Распределение памяти в стеке переменных в 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; 
} 
+0

'stack' не единственный способ реализовать автоматические переменные – coderredoc

+0

@coderredoc: для стандарта C++ требуется поведение стека для автоматических локальных переменных, поэтому это единственный способ. Как этот пакет реализован не предписан. –

+1

@MSlayer: Определен порядок переменных области пространства имен в каждой единицы перевода. Определен порядок элементов данных с тем же уровнем доступа в данном экземпляре класса. Порядок локальных автоматических переменных (в памяти) не определен. Реализация может свободно перемещать их. Однако он должен гарантировать, что конструкторы вызываются в порядке объявления переменных, а наоборот - для деструкторов. –

ответ

0

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

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

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

Я думаю, вы пытаетесь говорить о struct s и class es, где расположение памяти и адресное упорядочение переменных: as declared.

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

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

  • Компилятор устраняет dead variables

  • компилятор найдет наилучший порядок для хранения каждого из них, чтобы встретиться suitable alignment

  • компилятор может использовать процессор register directly в зависимости от того, что это Register Allocation алгоритма решает

  • компилятор могут объединять определенные переменные вместе в регистр vector и использовать векторные инструкции при условии, что они приведут к правильным результатам.

  • ... и многое другое.


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

+0

Также важно: автоматические переменные могут совместно использовать один и тот же адрес, если у них есть тривиальные деструкторы и фактически неперекрывающиеся жизни, а адреса могут меняться (!) Во время работы. – MSalters

3

Там нет никаких требований в стандарте С ++ для автоматического (что вы назвали стека) переменные, которые будут изложены в определенный заказ или место (до тех пор, пока удовлетворяются требования alignment).

0

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

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

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

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

Смежные вопросы