Padawan
473 / 323 / 30
Регистрация: 30.01.2010
Сообщений: 1,841
|
|
1 | |
Особенности хранения value type и reference type11.07.2011, 00:07. Показов 12255. Ответов 14
Метки нет (Все метки)
Всем известно, что значимые типы хранятся в стеке(смутно представляю, что он из себя представляет, было бы неплохо узнать), а ссылочные в куче.
Так вот, банально. Класс содержащий значимые свойства, хранится в куче, а сами свойства? Структура содержащая ссылочные свойства, хранится в стеке, а свойства в куче? Как все это выглядит? Добавлено через 5 минут В итоге, правильно ли я понимаю: 1. Указатели на ссылочные типы все таки хранятся в стеке? 2. Значимые свойства ссылочных типов хранятся в куче? 3. Ссылочные свойства значимых типов так же хранятся в куче? Добавлено через 7 минут Отличный разбор ситуации на забугорном.
1
|
11.07.2011, 00:07 | |
Ответы с готовыми решениями:
14
Value type и reference type Интересная ситуация с reference type Ошибка: cannot bind non-const lvalue reference of type 'double&' to an rvalue of type 'double' - почему? RVALUE Ссылка, error: cannot bind non-const lvalue reference of type 'String&' to an rvalue of type 'String'| |
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.
0
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
15.12.2012, 17:16 | 5 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Сообщение было отмечено как решение
Решение
Вот простой пример:
Колонка слева - адрес ячейки памяти, колонка справа - значение, хранящееся в этой ячейке.
7
|
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
|
|
15.12.2012, 17:23 | 6 |
0
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
15.12.2012, 17:27 | 7 |
1
|
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
|
|
15.12.2012, 17:56 | 8 |
Круто!
Вы не подскажите книгу, где подробно описаны все процессы в памяти(стеке, куче), я бы хотел подтянуть себя в этом. Добавлено через 10 минут Пожалуйста.
0
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
15.12.2012, 18:18 | 9 |
Вот в этой теме давал наводку на очень хорошую книжку: Как применить 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
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
19.03.2014, 00:41 | 12 |
Ага, ошибся с расположением класса в памяти: надо было начинать расположение полей снизу вверх, по мере увеличения памяти, но ошибку заметил уже где-то на 5-й картинке и переделывать было лень — все-таки показать в какую сторону "повернут" объект в памяти не было главной задачей.
0
|
Padawan
473 / 323 / 30
Регистрация: 30.01.2010
Сообщений: 1,841
|
|
19.03.2014, 09:57 [ТС] | 14 |
Psilon,
Не думаю, что так. Так ведь работать с адресацией неудобнее становится.
0
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
19.03.2014, 11:23 | 15 |
Так точно.
В общем, на картинках сверху расположение объектов в куче нужно перевернуть (кроме строк). Блин, надо переделать, чтобы народ не путать.
0
|
19.03.2014, 11:23 | |
19.03.2014, 11:23 | |
Помогаю со студенческими работами здесь
15
Non-const lvalue reference to type The type or namespace name 'Game1' could not be found (are you missing a using directive or an assembly reference?) Не открывается проект, пишет 'Could not convert variant of type (Null) into type (OleStr) Выводит ошибку type-declaration character does not match declared data type Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |