Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
4 / 4 / 0
Регистрация: 14.10.2017
Сообщений: 85
1

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

05.06.2019, 17:33. Просмотров 1432. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.06.2019, 17:33
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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
1092 / 766 / 216
Регистрация: 15.08.2010
Сообщений: 2,135
06.06.2019, 11:52 6
Лучший ответ Сообщение было отмечено 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.06.2019, 11:52

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Почему в Си массив со статическим размером объявленный внутри функции помещается в 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;' ...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.