Если я объявляю структуру данных глобально в приложении С++, она потребляет стек памяти или кучу памяти?
Например,
struct AAA
{
.../.../.
../../..
}arr[59652323];
Если я объявляю структуру данных глобально в приложении С++, она потребляет стек памяти или кучу памяти?
Например,
struct AAA
{
.../.../.
../../..
}arr[59652323];
Так как я не был удовлетворен ответами и надеюсь, что тот же каржаткар хочет узнать больше, чем просто простой ответ "да/нет", здесь вы идете.
Обычно процесс имеет 5 выделенных областей памяти
Если вы действительно хотите узнать, что сохраняется, тогда прочитайте и добавьте эти закладки:
COMPILER, ASSEMBLER, LINKER AND LOADER: КРАТКАЯ ИСТОРИЯ (смотри таблицу w.5)
alt text http://www.tenouk.com/ModuleW_files/ccompilerlinker006.png
Проблема здесь в этом вопросе. Предположим, что у вас есть крошечный C (++, а также они работают так же), как это:
/* my.c */
char * str = "Your dog has fleas."; /* 1 */
char * buf0 ; /* 2 */
int main(){
char * str2 = "Don't make fun of my dog." ; /* 3 */
static char * str3 = str; /* 4 */
char * buf1 ; /* 5 */
buf0 = malloc(BUFSIZ); /* 6 */
buf1 = malloc(BUFSIZ); /* 7 */
return 0;
}
main
. Строка, так как она является константой, выделяется в статическом пространстве данных вместе с другими строками.static
сообщает вам, что оно не должно быть выделено в стеке.buf1
находится в стеке, аmalloc
имеет обратную стоимость процента; вы всегда должны проверить возвращаемое значение.Например:
char * bfr;
if((bfr = malloc(SIZE)) == NULL){
/* malloc failed OMG */
exit(-1);
}
Обычно он не потребляет ни одного. Он пытается выделить их в сегменте памяти, который, вероятно, останется постоянным для выполнения программы. Это могут быть bss, stack, heap или data.
Ни. Это раздел .data.
Глобальная память предварительно выделяется в фиксированном блоке памяти или в куче в зависимости от того, как она распределяется вашим приложением:
byte x[10]; // pre-allocated by the compiler in some fixed memory block
byte *y
main()
{
y = malloc(10); // allocated on the heap
}
ИЗМЕНИТЬ:
Вопрос путается: Если я распределяю структуру данных глобально в приложении С++, она использует память стека или память кучи?
"выделить"? Это может означать много вещей, включая вызов malloc(). Было бы иначе, если бы вопрос был "если я объявляю и инициализирую структуру данных по всему миру".
Много лет назад, когда процессоры все еще использовали сегменты 64K, некоторые компиляторы были достаточно умны, чтобы динамически выделять память из кучи, а не резервировать блок в сегменте .data(из-за ограничений в архитектуре памяти).
Я думаю, я просто слишком стар.
Ни одно объявление структуры данных во всем мире на С++ не использует память кучи или стека. На самом деле глобальные переменные обычно выделяются в сегменте данных, размер которого остается неизменным в течение всей программы. Стеки и кучи обычно используются для переменных, которые создаются и уничтожаются во время выполнения программы.
В глобальном объекте будет выполняться память, которая выполняется для среды выполнения или компилятора для нее до main, это не переменная времени исполнения, поэтому ни стопка, ни куча.
Если объект объекта выделяет память, он будет находиться в куче, а любые последующие выделения объектом будут распределением кучи.
Это зависит от точной природы глобального объекта, если он является указателем или всем объектом, который является глобальным.
глобальные переменные живут в куче. это особый случай, потому что они живут в течение жизни программы
Если вы явно выделяете память самостоятельно с помощью new или malloc, то она будет выделена в кучу. Если компилятор выделяет память, то он будет выделен в стеке.