2015-11-03 7 views
0

Всякий раз, когда я вводя переменные и печатаю их адреса, видимо, они, как правило, хранятся в местах с регулярным интервалом, начиная с первой или последней введенной мной переменной (зависит от компилятора).Распределение памяти в C++

Действительно ли C++ распределяет память так, чтобы все переменные, введенные в определенное время, получали свою память? Если да, то разве это не плохо для управления памятью, потому что тогда компилятор должен будет убедиться, что он найдет достаточно места для передачи памяти всем переменным, которые мы ввели в строку?

Например.

int a, b, c; 

При печати &a, &b, &c, то ответ на один из составителей, что у меня есть это:

0xbffe2534 
0xbffe2538 
0xbffe253c 

И как вы можете видеть &b-&a=4 и &c-&b=4

На другой составитель, ответ:

0xbffe2534 
0xbffe2538 
0xbffe253c 

И снова &b-&a=4 и &c-&b=4.

ответ

0

Стандарт C++ не предусматривает какую-либо конкретную стратегию распределения памяти.

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

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

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

Отказ от ответственности: Я не нашел времени, чтобы рассказать о бесчисленных технологиях многократной обработки, которые выливаются последние 2-3 года. Поэтому вполне возможно, что даже Visual C++, с которым я знаком для обычного программирования, может поддерживать связанные стеки как расширение языка для некоторого контекста.

0

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

0

Способ выделения памяти, переменные будут помещены в стек. Это означает, что когда вы заявляете, это делается нажатием на stack. Посмотрите на этот код:

void f(int a){ 
    int b=a; 
    if(a) 
    f(a-1); 
    printf("%i, %i\n", a, b"); 
} 

Здесь, когда процессор входит функция F, она толкает б на стек, чтобы иметь место для его хранения. Затем он вызывает f снова. Теперь мы не можем хранить b в том же месте, что и предыдущий вызов, потому что нам все еще нужно это значение. Поэтому каждый раз, когда вы вводите функцию (или фактически область), ваши локальные переменные помещаются в стек и остаются там до тех пор, пока вы не оставите эту функцию (область) еще раз.

Существует еще один способ выделения памяти, и это называется кучей. Это делается malloc() в c или new int int C++. Я не собираюсь сейчас это объяснять. Просто зайдите в Google;) и не забудьте указать free() или delete

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