Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/68: Рейтинг темы: голосов - 68, средняя оценка - 4.60
Padawan
473 / 323 / 30
Регистрация: 30.01.2010
Сообщений: 1,841
1

Особенности хранения value type и reference type

11.07.2011, 00:07. Показов 12255. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем известно, что значимые типы хранятся в стеке(смутно представляю, что он из себя представляет, было бы неплохо узнать), а ссылочные в куче.
Так вот, банально.
Класс содержащий значимые свойства, хранится в куче, а сами свойства?
Структура содержащая ссылочные свойства, хранится в стеке, а свойства в куче?
Как все это выглядит?

Добавлено через 5 минут
В итоге, правильно ли я понимаю:
1. Указатели на ссылочные типы все таки хранятся в стеке?
2. Значимые свойства ссылочных типов хранятся в куче?
3. Ссылочные свойства значимых типов так же хранятся в куче?

Добавлено через 7 минут
Отличный разбор ситуации на забугорном.
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.07.2011, 00:07
Ответы с готовыми решениями:

Value type и reference type
Всем привет! После прочтения некоторых книг по .NET до сих пор меня мучат несколько вопросов. В...

Интересная ситуация с reference type
class Program { public Program(int o) { ...

Ошибка: cannot bind non-const lvalue reference of type 'double&' to an rvalue of type 'double' - почему?
Всем привет! В программе вызываю функцию: UpdateEditControl(IDC_EDIT7,...

RVALUE Ссылка, error: cannot bind non-const lvalue reference of type 'String&' to an rvalue of type 'String'|
Код не компилируется ниже 17 стандарта с++ с ошибкой error: cannot bind non-const lvalue reference...

14
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
15.12.2012, 12:24 2
Класс содержащий значимые свойства, хранится в куче, а сами свойства?

При создании класса, создается память и для всех его ПОЛЕЙ(свойства - всего лишь набор методов), т.е. при создании класса значения его полей тоже создаются в управляемой куче и не создают своих копий в стеке, т.е. автоматической упаковки не происходит.

Структура содержащая ссылочные ПОЛЯ хранится в стеке, а ее поля хранят ссылку на данные в управляемой куче.
Т.е. если она создана без инициализации полей, в полях будет null.

Стек - определенная область оперативной памяти, организованная по принципу lifo, last in first out, т.е. если вы в методе создадите переменную типа значения, то она будет жить только в том методе где вы ее создали, после того как метод отработал, она автоматически удалится. А переменная ссылочного типа будет ждать сборщика мусора.
1
36 / 19 / 1
Регистрация: 14.12.2012
Сообщений: 59
15.12.2012, 12:53 3
1. Да
2. Да
3. Да
И еще классная серия статей про память в .NET: http://www.c-sharpcorner.com/u... emory.aspx
0
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
15.12.2012, 13:16 4
Вот простая программа, которая более детально может пояснить главное отличие value type от reference type.
Внимательно посмотрите на значение first number, после вызова первого метода firstNumber будет равно 10, а после вызова второго 17.

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
class Program
    {
        static void Main(string[] args)
        {
            int firtsNumber = 10;
            int secondNumber = 20;
            Foo foo = new Foo();
            
            // вот тут мы вызываем метод который будет работат с типами значения так, как они работаю обычно.
            // Т.е. когда вы сохздаете метод с параметрами value type, метод будет автоматически копировать значения которые
            // вы подадите ему на вход и уже работать с их копиями, которые сразу же исчезнут при отработке метода
            // есть способ избежать этого, работая с value type как с reference type, передавая не копии переменных, а
           // ссылки на них в памяти.
            // После того как этот метод отработает копия переменной firstNumber исчезнет и само значение firstNumber не
            // изменится
            Console.WriteLine(foo.Sum(firtsNumber,secondNumber));
 
            //Вот тут мы вызываем другой метод, в который уже подаем параметры по ссылке на них,
            // Т.е. этот метод будет работать с оригиналом переменных, а значит при его отработке переменная firstNumber изменится
            // и будет равна 17
            Console.WriteLine(foo.Sum(ref firtsNumber, ref secondNumber));
 
            Console.WriteLine(firtsNumber);
        }
    }
 
    class Foo
    {
        public int Sum(int x, int y)
        {
            int z = x + y;
            x = 17;
            return z;
        }
 
        public int Sum(ref int x, ref int y)
        {
            int z = x + y;
            x = 17;
            return z;
        }
    }
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
15.12.2012, 17:16 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
class Program
{
    static void Main()
    {
        Foo foo = null;
        foo = new Foo();
        foo.x = 0x01234567;
        foo.y = 0x0123456789ABCDEF;
        foo.str = "Hello";
        foo.bar.x = 0xAABBCCDD;
        foo.bar.foo = foo;
        foo.bar.str = "World";
 
        Bar bar;
        bar.x = 0xAABBCCDD;
        bar.foo = foo;
        bar.str = "!!!";
    }
}
 
class Foo
{
    public int x;
    public long y;
    public Bar bar;
    public string str;
}
 
struct Bar
{
    public uint x;
    public Foo foo;
    public string str;
}
Ниже примерное представление памяти на момент выполнения каждой из строчек вышеприведенного кода.
Колонка слева - адрес ячейки памяти, колонка справа - значение, хранящееся в этой ячейке.
C#
1
Foo foo = null;
Особенности хранения value type и reference type


C#
1
foo = new Foo();
Особенности хранения value type и reference type


C#
1
foo.x = 0x01234567;
Особенности хранения value type и reference type


C#
1
foo.y = 0x0123456789ABCDEF;
Особенности хранения value type и reference type


C#
1
foo.str = "Hello";
Особенности хранения value type и reference type


C#
1
foo.bar.x = 0xAABBCCDD;
Особенности хранения value type и reference type


C#
1
foo.bar.foo = foo;
Особенности хранения value type и reference type


C#
1
foo.bar.str = "World";
Особенности хранения value type и reference type


C#
1
Bar bar;
Особенности хранения value type и reference type


C#
1
bar.x = 0xAABBCCDD;
Особенности хранения value type и reference type


C#
1
bar.foo = foo;
Особенности хранения value type и reference type


C#
1
bar.str = "!!!";
Особенности хранения value type и reference type
7
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
15.12.2012, 17:23 6
Цитата Сообщение от kolorotur Посмотреть сообщение
Вот простой пример:
А вы не подскажите, как вы получили таблицы приведенные ниже?
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
15.12.2012, 17:27 7
Цитата Сообщение от n1l Посмотреть сообщение
А вы не подскажите, как вы получили таблицы приведенные ниже?
Microsoft Visio и двадцать минут свободного времени.
1
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
15.12.2012, 17:56 8
Цитата Сообщение от kolorotur Посмотреть сообщение
Microsoft Visio и двадцать минут свободного времени.
Круто!

Вы не подскажите книгу, где подробно описаны все процессы в памяти(стеке, куче), я бы хотел подтянуть себя в этом.

Добавлено через 10 минут
Пожалуйста.
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
15.12.2012, 18:18 9
Цитата Сообщение от n1l Посмотреть сообщение
Вы не подскажите книгу, где подробно описаны все процессы в памяти(стеке, куче)
Вот в этой теме давал наводку на очень хорошую книжку: Как применить ref и out для ссылок на объекты
Там даже вроде бы русский перевод нашли.
2
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
15.12.2012, 18:20 10
Ой спасибо огромное.
0
Padawan
473 / 323 / 30
Регистрация: 30.01.2010
Сообщений: 1,841
18.03.2014, 21:50  [ТС] 11
kolorotur,

Не по теме:

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

0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
19.03.2014, 00:41 12
Цитата Сообщение от Johnny_D Посмотреть сообщение
Только не пойму почему у вас адресация памяти на картинках в разные стороны растет.
Ага, ошибся с расположением класса в памяти: надо было начинать расположение полей снизу вверх, по мере увеличения памяти, но ошибку заметил уже где-то на 5-й картинке и переделывать было лень — все-таки показать в какую сторону "повернут" объект в памяти не было главной задачей.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.03.2014, 00:51 13
По-моему куча растет снизу вверх, а стек - сверху вниз относительно адресов (или наоборот, уже не помню). В общем факт в том, что они растут "навстречу"
0
Padawan
473 / 323 / 30
Регистрация: 30.01.2010
Сообщений: 1,841
19.03.2014, 09:57  [ТС] 14
Psilon,
Не думаю, что так. Так ведь работать с адресацией неудобнее становится.
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
19.03.2014, 11:23 15
Цитата Сообщение от Psilon Посмотреть сообщение
По-моему куча растет снизу вверх, а стек - сверху вниз относительно адресов
Так точно.

В общем, на картинках сверху расположение объектов в куче нужно перевернуть (кроме строк).
Блин, надо переделать, чтобы народ не путать.
0
19.03.2014, 11:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.03.2014, 11:23
Помогаю со студенческими работами здесь

Non-const lvalue reference to type
Добрый день. Мне надо передать указатель на матрицу (Шахматная доска) Piece* board в функцию...

The type or namespace name 'Game1' could not be found (are you missing a using directive or an assembly reference?)
The type or namespace name 'Game1' could not be found (are you missing a using directive or an...

Не открывается проект, пишет 'Could not convert variant of type (Null) into type (OleStr)
Крч такое дело было, я добавил в главный юнит функцию отслеживания активности форма, но не мог...

Выводит ошибку type-declaration character does not match declared data type
Не могу понять где ошибка в программе, помогите исправить, очень нужна ваша помощь.. Sub lab4()...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru