Чем отличается размещение в стеке от размещения в куче?
В каких случаях где лучше размещать?
Влияет ли это на размер программ и быстродействие или на что-нибудь ещё?
Легкий путь открывается лишь тому, кто по трудному пути прошел.
Здравствуйте alfarn, вы писали:
A>Чем отличается размещение в стеке от размещения в куче? A>В каких случаях где лучше размещать? A>Влияет ли это на размер программ и быстродействие или на что-нибудь ещё?
Хотелось бы посмотреть, что Вы под этим подразумеваете. Два кода: однин с выделением
памяти на куче, другой на стеке.
На размер на диске не влияет точно.
Отличия. Раз мы уже о С/С++ говорим, то в стеке хранятся все локальные переменные.
При входе в область видимости место выделяется, при выходе освобождается.
На куче, ты делаешь все сам, явно говоришь, когда выделлять место, когда освобождать.
От сюда все различия и разница в использовамии.
Не понятен вопрос: "в каких случаях где лучше размещать?"
Как-то никогда с ним не сталкивался. Приведите, плиз, пример, где
над этим стоит поразмышлять?
Проблемы с выделением памяти в стеке могут возникнуть в виде переполнения стека.
void f(int i){
if (i==0) return;
char a[100000];
f(i-1);
}
Вызов f(10000) может легко переполнить стек.(если компилятор не выкинет ненужный код).
Других проблем я не вижу.
Очень объемный вопрос? Где-то месяц назад на форуме iXBT жестоко обсуждалась :-)
Естественно, размещение в стеке намного быстрее (на порядки), конечно если не требуется куча памяти.
Т.е. выделение локальной памяти до 4Kb выполняется в среднем с нулевой затратой (0.5 такта).
Если более 4Kb, то стек выделяется с проверкой (вызов функции типа _chkstack), но в любом случае
дешевле чем явное выделение из кучи. Не забудь учесть также практически бесплатное высвобождение
локальной памяти (а для высвобождения участка из кучи требуется вызов деаллокатора).
Также есть влияние на размер программы (но гораздо меньшее, то есть его можно не учитывать).
A>Чем отличается размещение в стеке от размещения в куче? A>В каких случаях где лучше размещать? A>Влияет ли это на размер программ и быстродействие или на что-нибудь ещё?
Здравствуйте fomisha, вы писали:
F>Хотелось бы посмотреть, что Вы под этим подразумеваете. Два кода: однин с выделением F>памяти на куче, другой на стеке.
[teasing mode on]
Уважаемый fomisha :), как раз это просто. Вот Вам пример:
Выделение в куче:
void * pvBuffer = malloc(4096)
Выделение на стеке:
void * pvBuffer = _alloca(4096)
Подозреваю, что Вы сейчас броситесь искать описание функции _alloca. Не волнуйтесь, в свое время я тоже бросился. :)
[teasing mode off]
А если серьезно — на стеке лучше только локальные буфера и переменные размещать. И маленькие (поскольку по умолчанию в Вин32 размер стека 1 метр). Данные, необходимые более, чем в одной функции и до 1 мега лучше класть в хип. А выше — если это Вин32, то VirtualAlloc. Если нет — сорьки, тут я не спец.