Глобальное управление памятью на С++ в стеке или куче?

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

Например,

struct AAA
{

.../.../.
../../..
}arr[59652323];

Ответы

Ответ 1

Так как я не был удовлетворен ответами и надеюсь, что тот же каржаткар хочет узнать больше, чем просто простой ответ "да/нет", здесь вы идете.

Обычно процесс имеет 5 выделенных областей памяти

  • Код - текстовый сегмент
  • Инициализированные данные - сегмент данных
  • Неинициализированные данные - сегмент bss
  • Heap
  • Stack

Если вы действительно хотите узнать, что сохраняется, тогда прочитайте и добавьте эти закладки:

COMPILER, ASSEMBLER, LINKER AND LOADER: КРАТКАЯ ИСТОРИЯ (смотри таблицу w.5)

Анатомия программы в памяти

alt text http://www.tenouk.com/ModuleW_files/ccompilerlinker006.png

Ответ 2

Проблема здесь в этом вопросе. Предположим, что у вас есть крошечный 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;
}
  • Это не выделяется в стеке NOR в куче. Вместо этого он выделяется как статические данные и помещается в собственный сегмент памяти на большинстве современных машин. Фактическая строка также выделяется как статические данные и помещается в сегмент, доступный только для чтения, в машинах с правомерным мышлением.
  • - это просто статический выделенный указатель; место для одного адреса, в статических данных.
  • имеет указатель, выделенный в стеке, и будет эффективно освобожден при возврате main. Строка, так как она является константой, выделяется в статическом пространстве данных вместе с другими строками.
  • на самом деле распределяется точно так же, как и в 2. Ключевое слово static сообщает вам, что оно не должно быть выделено в стеке.
  • ... но buf1 находится в стеке, а
  • ... буферное пространство malloc'ed находится в куче.
  • И, кстати, дети не пробовали это дома. malloc имеет обратную стоимость процента; вы всегда должны проверить возвращаемое значение.

Например:

char * bfr;
if((bfr = malloc(SIZE)) == NULL){
   /* malloc failed OMG */
   exit(-1);
}

Ответ 3

Обычно он не потребляет ни одного. Он пытается выделить их в сегменте памяти, который, вероятно, останется постоянным для выполнения программы. Это могут быть bss, stack, heap или data.

Ответ 4

Ни. Это раздел .data.

Ответ 5

Глобальная память предварительно выделяется в фиксированном блоке памяти или в куче в зависимости от того, как она распределяется вашим приложением:

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(из-за ограничений в архитектуре памяти).

Я думаю, я просто слишком стар.

Ответ 6

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

Program Memory Space

Ответ 7

В глобальном объекте будет выполняться память, которая выполняется для среды выполнения или компилятора для нее до main, это не переменная времени исполнения, поэтому ни стопка, ни куча.

Если объект объекта выделяет память, он будет находиться в куче, а любые последующие выделения объектом будут распределением кучи.

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

Ответ 8

глобальные переменные живут в куче. это особый случай, потому что они живут в течение жизни программы

Ответ 9

Если вы явно выделяете память самостоятельно с помощью new или malloc, то она будет выделена в кучу. Если компилятор выделяет память, то он будет выделен в стеке.