2016-08-12 2 views
1

Если я объявить переменную какстека и кучи памяти в C++

int a[100] 

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

Рассмотрим я определить структуру

struct abc 
{ 
    int a[100]; 
}; 

и где-то в коде я использую эту структуру как

abc P; //line 1 
abc *p = new abc(); //line 2 

Теперь массив находится внутри этих двух объектов (один на стеке (строка 1) и один на куче (строка 2)). Где находится внутренний массив?

Благодаря

+0

Какое это имеет значение? Вместо необработанных массивов следует использовать 'std :: vector' или' std :: array'. Также предпочитает автоматическое хранение по динамическому хранилищу. – crashmstr

+1

@crashmstr некоторые рекомендации для локальных компаний C++ для встроенного C++, в частности, запрещают использование многих std-конструкций, а также концепций C++ 1x, и в этом случае вышеупомянутое может быть релевантным. – dfri

+0

@dfri true, но OP ничего не говорит об этих ограничениях, а встроенные и другие специфические потребности платформы обычно находятся за пределами «общих рекомендаций» для идиоматического C++. – crashmstr

ответ

4

Место для элемента данных зависит от местоположения объекта содержит его. Когда структура находится в стеке, все ее элементы находятся в стеке. Когда структура находится в куче, так же как и члены.

0

В строке 1 массив находится в стеке.

В строке 2 массив находится на куче.

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

Вот почему вы можете назначить-структуру для структуры, как

s1 = s2; 

и все массивы копируются - он обрабатывается как один большой кусок данных (хотя это мелкая копия, массивы занимают реальную память).

0

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

+0

Привет, TheStroyer, и добро пожаловать в Stack Overflow. Не могли бы вы немного расширить свой ответ? Это довольно сложно понять, потому что ваше объяснение очень короткое. –

+0

Думаю, мне больше не нужно расширять его, потому что кто-то еще отправил хороший ответ. Я буду иметь в виду, что я должен сделать свои ответы максимально ясными в этой функции. – theStroyer