4 / 4 / 0
Регистрация: 14.10.2017
Сообщений: 85

STACK и HEAP - где лежат значения объектов

05.06.2019, 17:33. Показов 2845. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Разбираюсь с STACK и HEAP.
Объясните где не прав.

По умолчанию в STACK помещаются value типы.
По умолчанию в HEAP помещаются reference типы.

Вложенные типы имеющие отношение has-a или поля находятся не совсем на прямую в STACK или HEAP,
поля типов хранятся как часть самого экземпляра типа. Они физически лежат в том куске памяти, который выделен под конкретных экземпляр типа.

Объясните, а то я запутался что то:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 public class Acls()           //0. лежит в HEAP
{
 
  string[] arrayA = "HelloA";     //1. лежит в HEAP
   int valueA = 10;              //2. в STACK лежит ссылка на valueA который лежит в HEAP
 
   public void GoStruct()
   {
      string[] arrayAGO = "WorldA";  //3.  лежит в HEAP
      int valueAGo = 20;            //4. Тут запутался, где конкретно должен лежать, наверное
                                       // в  STACK лежит ссылка на valueAGO который лежит в HEAP
  
     A1 a1 = new A1();                   //5. где лежит?
     a1.valueA1 = 10;                     //6. где лежит?
     a1.arrayA1 = "123";                 //7. где лежит?
     
     B1 b1 = new B1();                   //8. где лежит?
     b1.arrayB1 = "123";                //9. где лежит?
     b1.valueB1 = 30;                  //10. где лежит?
   }
 
}
 public class A1cls()
  { 
   int valueA1 = 10; 
   string [] arrayA1= "HelloA1";
   }
 
 
public struct Bstr()                  //11. Лежит в STACK
{
   string[] arrayB = "HelloB";        //12. лежит в STACK 
   int valueB = 30;                   //13.  лежит в STACK
 
   public void GoStruct()
   {
      string[] arrayBGO = "WorldB";     //14. -- запутался где конкретно должен лежать,  наверное в STACK
      int valueBGo = 40;               //15.  -- запутался где конкретно должен лежать, наверное в STACK
 
     A1 a1 = new A1();              //16. где лежит?
     a1.valueA1 = 10;              //17. где лежит?
     a1.arrayA1 = "123";          //18. где лежит?
     
     B1 b1 = new B1();
     b1.arrayB1 = "123";            //19. где лежит?
     b1.valueB1 = 30;              //20. где лежит?
 
   }
}
 
public struct B1str()    
{
   string[] arrayB1 = "HelloB1";              
   int valueB1 = 30;                            
}
Прошу ответить по номерам, где что лежит, где ссылка на объект в памяти, где сам объект в памяти.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.06.2019, 17:33
Ответы с готовыми решениями:

Хранение переменных в HEAP (устройство Stack и Heap)
Добрый день. Проблемы с устройством памяти стека и кучи: если я создаю объект vanya класса Person, с приватными переменными int age, high,...

Память Heap и Stack
Здравствуйте , подскажите пожалуйста такой вопрос . Вот есть есть три области памяти Heap,Stack ,PermGen . Вопрос вот в чем . Мы создаем...

Распределение памяти под Stack и Heap
Подскажите пожалуйста, правильно ли я понимаю что при использовании функций malloc или calloc необходимо выделять память именно в куче...

5
4 / 4 / 0
Регистрация: 14.10.2017
Сообщений: 85
06.06.2019, 01:20  [ТС]
Серьезно? Никто не хочет помочь расписать? Ну ведь не такой уж и Рихтер, ребят помогите разобраться.
Отцы выручите.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
06.06.2019, 01:46
Цитата Сообщение от Alone11 Посмотреть сообщение
По умолчанию в STACK помещаются value типы.
По умолчанию в HEAP помещаются reference типы.
смотря что подразумевать под по умолчанию. вообще где будет размещен объект решает среда, никто не запрещает размещать ссылочные типы в стеке или значимые в куче.

Цитата Сообщение от Alone11 Посмотреть сообщение
string[] arrayA = "HelloA";
массиву строк присваивается строка
Цитата Сообщение от Alone11 Посмотреть сообщение
public class Acls()
объявление класса со скобками

попробуйте предоставить корректный код, и там уже комментить где вам непонятно. А то пол строки про массивы, пол строки про строки. От этого будет зависеть где разместится объект, а какие пол строки вы имели ввиду я без понятия
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
06.06.2019, 01:59
Цитата Сообщение от КОП Посмотреть сообщение
какие пол строки вы имели ввиду я без понятия
"оно" тоже не в курсе,relax
0
4 / 4 / 0
Регистрация: 14.10.2017
Сообщений: 85
06.06.2019, 10:38  [ТС]
КОП,
Прошу прощения, код писал в попыхах, получился какой то лютый шлак.
Вот поправил.
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
   public class Acls          //0. лежит в HEAP
{
 
    string arrayA = "HelloA";     //1. лежит в HEAP
    int valueA = 10;              //2. в STACK лежит ссылка на valueA который лежит в HEAP
 
    public void GoStruct()
    {
        string arrayAGO = "WorldA";   //3.  лежит в HEAP
        int valueAGo = 20;            //4. Тут запутался, где конкретно должен лежать, наверное
                                      // в  STACK лежит ссылка на valueAGO который лежит в HEAP
 
        A1cls a1 = new A1cls();               //5. где лежит?
        a1.valueA1 = 10;                     //6. где лежит?
        a1.arrayA1 = "123";                 //7. где лежит?
 
        B1str b1 = new B1str();                   //8. где лежит?
        b1.arrayB1 = "123";                //9. где лежит?
        b1.valueB1 = 30;                  //10. где лежит?
    }
 
}
public class A1cls
  { 
   public int valueA1 = 10;
   public string arrayA1 = "HelloA1";
   }
 
 
public struct Bstr                 //11. Лежит в STACK
{
        string arrayB;           //12. лежит в STACK 
        int valueB;             //13.  лежит в STACK
 
public void GoStruct()
{
    string arrayBGO = "WorldB";     //14. -- запутался где конкретно должен лежать,  наверное в STACK
    int valueBGo = 40;               //15.  -- запутался где конкретно должен лежать, наверное в STACK
 
    A1cls a1 = new A1cls();              //16. где лежит?
    a1.valueA1 = 10;                   //17. где лежит?
    a1.arrayA1 = "123";              //18. где лежит?
 
    B1str b1 = new B1str();
    b1.arrayB1 = "123";            //19. где лежит?
    b1.valueB1 = 30;              //20. где лежит?
 
}
}
 
public struct B1str   
{
        public string arrayB1;
        public int valueB1;                            
}
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
06.06.2019, 11:52
Лучший ответ Сообщение было отмечено Alone11 как решение

Решение

Alone11, про 3й пункт можно для упрощения считать что в метаданные это куча
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
public class Acls          //0. нигде не лежит, это объявление
    {
        string arrayA = "HelloA";     //1. ссылка на строку будет лежать там, где будет расположен объект класса
        int valueA = 10;              //2. int будет лежать там, где будет расположен объект класса
 
        public void GoStruct()
        {
            string arrayAGO = "WorldA";   //3. ссылка в стеке, значение в потоке методанных сборки
            string arrayAGO2 = new string("WorldA");   //3.1. ссылка в стеке, значение в куче
            int valueAGo = 20;            //4. значение лежит в стеке, никаких ссылок нет
 
            A1cls a1 = new A1cls();               //5. ссылка в стеке, объект в куче
            a1.valueA1 = 10;                     //6. куча(см. пункт 2)
            a1.arrayA1 = "123";                 //7. куча (см. пункт 1)
 
            B1str b1 = new B1str();                   //8. в стеке
            b1.arrayB1 = "123";                //9. только ссылка в стеке
            b1.valueB1 = 30;                  //10. в стеке
        }
 
    }
    public class A1cls
    {
        public int valueA1 = 10;
        public string arrayA1 = "HelloA1";
    }
 
 
    public struct Bstr                 //11. это объявление
    {
        string arrayB;           //12. там, где будет расположен объект
        int valueB;             //13.  там, где будет расположен объект
 
        public void GoStruct()
        {
            string arrayBGO = "WorldB";     //14.  (см. пункт 3)
            int valueBGo = 40;               //15.  (см. пункт 4)
 
            A1cls a1 = new A1cls();              //16.  (см. пункт 5)
            a1.valueA1 = 10;                   //17.  (см. пункт 6)
            a1.arrayA1 = "123";              //18.  (см. пункт 7)
 
            B1str b1 = new B1str();        // в стеке
            b1.arrayB1 = "123";            //19.  (см. пункт 9)
            b1.valueB1 = 30;              //20.  (см. пункт 10)
 
        }
    }
 
    public struct B1str
    {
        public string arrayB1;
        public int valueB1;
    }
однако судя по коду вам надо сначала разобраться с тем, что является массивом и как организованы классы. Ну а потом уже лезть на стеки/кучи
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.06.2019, 11:52
Помогаю со студенческими работами здесь

STM32F303 задать размер STACK and HEAP
Проблема в следующем - имеющийся в моем коксе стартовый файл stortup_stm32f30x.S не имеет "доступной для моего уровня владения...

Почему в Си массив со статическим размером объявленный внутри функции помещается в stack, а не в heap?
Собственно, сабж. Чем было обусловленно такое решение? В джава, например, массив будет создан в хипе сразу и возвратится указатель...

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

[bcc32 Error] File1.cpp(19): E2316 'Stack<T>::Stack()' is not a member of 'Stack<T>'
Возникает ошибка File1.cpp(19): E2316 'Stack&lt;T&gt;::Stack()' is not a member of 'Stack&lt;T&gt;' #pragma hdrstop #pragma argsused ...

HeapWalk() и managed heap. Может ли само приложение в какой-то точке своего кода запросить список своих объектов
Для неуправляемого кода существуют функции для получения информации об объектах, находящихся в куче. Например, HeapWalk() и все, что с ним...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru