Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.65/26: Рейтинг темы: голосов - 26, средняя оценка - 4.65
101 / 101 / 15
Регистрация: 23.05.2012
Сообщений: 260

Значимые и ссылочные типы. Куча и стек. И всем таким темам посвящается

24.05.2014, 04:26. Показов 5400. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
А вот у меня на все бывшие и будущие вопросы про стек и кучу возник такой вопрос

C#
1
2
3
4
5
6
7
8
class Program
    {
        int j=3;
        static void Main(string[] args)
        {
             int i = 5;
        }
    }
это же класса program следовательно j - поле следовательно в кучу, а i - значит в стек? Или как? И ПОЧЕМУ?
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.05.2014, 04:26
Ответы с готовыми решениями:

Где найти подробную информацию про ссылочные и значимые типы, стек и управляемую кучу
Где найти подробную инфу про ссылочные и значимые типы, стек и управляемую кучу, что откуда летит и куда и т.д. подробно с...

Значимые и ссылочные типы данных
Тип int - значимый тип данных, соответственно и переменные этого типа хранятся в стеке. Меня интересует, каким типом (значимым или...

Ссылочные и значимые типы, разобрать пример
Во всех книга расписываются следующий образом. Ссылочный тип - ссылка на объект в куче, значимый - объект в стеке, работа идет с его...

34
8 / 8 / 2
Регистрация: 10.12.2013
Сообщений: 148
24.05.2014, 14:33
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Psilon Посмотреть сообщение
с одной стороны, строка является ссылочным типом, и значит хранится в куче.
Да string ссылочный тип, должна хранится в куче, но команда ldstr - Позволяет загружать в стек строковое значение - не понятно)
0
101 / 101 / 15
Регистрация: 23.05.2012
Сообщений: 260
24.05.2014, 14:46  [ТС]
Psilon у нас в городе есть такси Максим
Тебе за одни и те же деньги независимо от тебя может приехать как такси Лада так и такси Лексус

Все зависит от посредника/оператора

Добавлено через 4 минуты
AleksyVB в стек или само значение или ссылку ты положишь

ldstr - помещает в стек ссылку на новый объект, представляющий собой массив символов или если не ошибаюсь по умному "строковой литерал". Так в С++ было
0
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
24.05.2014, 14:50
AleksyVB, CIL работает только со стеком

Добавлено через 2 минуты
Цитата Сообщение от DPW Посмотреть сообщение
ldstr - помещает в стек ссылку на новый объект, представляющий собой массив символов или если не ошибаюсь по умному "строковой литерал".
саму строку
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
24.05.2014, 14:51
Metall_Version, нет же
The ldsfld operation pushes the value of a static field onto the evaluation stack, while the ldstr pushes a reference to a meta data string literal.
0
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
24.05.2014, 14:55
Psilon, в документации помню как раз толкает - саму строку. ldstr
значит ошибался.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
24.05.2014, 15:05
Metall_Version, вот документация:
0x72
ldstr <string>
Push a string object for the literal string.
то есть пушит ссылку (которая называется string object), которая указывает на саму строку (literal string).

Добавлено через 8 минут
Metall_Version, тут как раз вопрос в интернировании. То есть этакое GZIP-архивирование. Все строки в программе, являющиеся константами, просто заносятся в файл метадаты, и при использовании в программе будут заменены на этот указатель. Пример:
C#
1
2
3
4
5
6
7
8
9
10
11
12
        const string a = "Hello ";
        private static string b = new string(new[] {'w', 'o', 'r', 'l', 'd', '!'});
        static void Main()
        {
            Foo();
        }
 
        private static void Foo()
        {
            string result = a + b;
            Console.WriteLine(result);
        }
Нас интересует метод Foo
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.method private hidebysig static void  Foo() cil managed
{
  // Размер кода:       25 (0x19)
  .maxstack  2
  .locals init ([0] string result)
  IL_0000:  nop
  IL_0001:  ldstr      "Hello "
  IL_0006:  ldsfld     string ConsoleApplication43.Program::b
  IL_000b:  call       string [mscorlib]System.String::Concat(string,
                                                              string)
  IL_0010:  stloc.0
  IL_0011:  ldloc.0
  IL_0012:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_0017:  nop
  IL_0018:  ret
} // end of method Program::Foo
заметь, что для строки Hello было использовано ldstr (загрузка из метадаты), а для второй - ldsfld.
0
101 / 101 / 15
Регистрация: 23.05.2012
Сообщений: 260
24.05.2014, 15:05  [ТС]
Metall_Version вот реально тебе и Psilon с уважением за знание С#
я не претендую и близко однако есть моменты которые интересны, есть в которых я параллель провожу с С++

Там тоже был неродной string который сам по себе есть массив char только однобайтовых
Но работая в СИСТЕМЕ могу с ПОЛНОЙ уверенностью сказать что выдать старое за новое проще и быстрее чем ВСЕ набело переписывать

От того искренне верю что String есть все тот же массив, т.е. сама строка но с маленькими Атрибутами
0
101 / 101 / 15
Регистрация: 23.05.2012
Сообщений: 260
24.05.2014, 15:07  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
То есть этакое GZIP-архивирование
Ну вот не совсем так а скорее в лоб
Цитата Сообщение от Psilon Посмотреть сообщение
просто заносятся в файл метадаты, и при использовании в программе будут заменены
0
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
24.05.2014, 15:08
Psilon, http://www.codeguru.com/csharp... torial.htm
C#
1
ldstr "Hello, World"  // load string onto stack
разве тут про ссылку говорят?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
24.05.2014, 15:13
Metall_Version, строка - ссылочный тип, её нельзя загрузить в стек. Проверить проще простого - создай строку размером 200 мб (в стек столько не влезет) и попробуй её распечатать на экране. Если бы она загружалась в стек, ты бы сразу получил stackoverflow
Единственный способ разместить ссылочный объект на стеке - использовать оператор stackalloc, и то он по-моему работает только с массивами (а строка это не массив, как не крути), а во-вторых только в небезопасном контексте

DPW, string - объект, состоящий из трех полей: указателя на массив символов, int-поля длины строки m_stringLength, а также первый символ m_firstChar. Подробнее можно почитать тут:
http://habrahabr.ru/post/165597/
http://habrahabr.ru/post/136609/
1
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
24.05.2014, 15:24
Psilon, ясно , думал раз CIL работает со всем через стек (виртуальный) то и строку, локальную, полностью заносит в него.
Получается все как писал Рихтер - все ссылочные типы в куче. а стеке либо ссылка , либо ничего
0
101 / 101 / 15
Регистрация: 23.05.2012
Сообщений: 260
24.05.2014, 15:26  [ТС]
Да Да Да

Утя раз
Цитата Сообщение от Psilon Посмотреть сообщение
ты бы сразу получил stackoverflow
потому шо стек це размероимеющая хрень

утя два
Цитата Сообщение от Psilon Посмотреть сообщение
string - объект, состоящий из трех полей
а я о чем - атрибути - як без него

Добавлено через 1 минуту
Metall_Version
Цитата Сообщение от Metall_Version Посмотреть сообщение
CIL работает со всем через стек
так оно и есть
Только не строку а ссылку
0
8 / 8 / 2
Регистрация: 10.12.2013
Сообщений: 148
24.05.2014, 15:37
Assembler
1
2
3
  IL_0000:  ldarg.0
  IL_0001:  ldc.i4.s   50
  IL_0003:  stfld      int32 ConsoleApplication2.MyClass::i
Значит здесь int i = 50, так как является полем ссылочного типа - класса (нового экземпляра) сохраняется в куче, в стеке только ссылка. И перевод ldc - Позволяет загружать в стек значение константы не корректен. Или не так?)
0
101 / 101 / 15
Регистрация: 23.05.2012
Сообщений: 260
24.05.2014, 15:45  [ТС]
Цитата Сообщение от AleksyVB Посмотреть сообщение
stfld * * *int32 ConsoleApplication2.MyClass::i
последовательность изменения состояния стека:
ссылка на объект (или указатель) помещается в стек;
значение передается в стек;
значение и ссылка на объект (или указатель) извлекаются из стека; значение поля объекта заменяется на новое значение
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
24.05.2014, 17:31
Metall_Version, так рихтер был прав!!

DPW,
The default stack size for a .NET application is 1 MB (default is 256 KB for 32-bit ASP.NET apps and 512 KB for 64-bit ASP.NET apps), but you can change that. For the application you can change the default size by modifying the PE header of the executable. For threads you create, you can use the constructor overload that takes a stack size.

But as Anton Tyjhyy points out in his answer, arrays are reference types and thus located on the heap (even if the array happens to hold a bunch of value types).
Добавлено через 40 минут
Цитата Сообщение от Metall_Version Посмотреть сообщение
Получается все как писал Рихтер - все ссылочные типы в куче. а стеке либо ссылка , либо ничего
в стеке в любом случае ссылка. null - Это не отсутствие ссылки (и даже не ноль). null-pointer указывает на специальную область памяти, называемую NULL-Pointer Assignment Partition , для 32-битной винды это адреса 0x00000000 - 0x0000FFFF
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.05.2014, 17:31

Значимые типы
Вот почему все говорят что значимые типы хранятся в стеке? Они же хранятся в секции данных приложение, и при передачи в функцию копируются...

Где хранятся значимые типы данных?
Ссылочные типы храняться в куче, куча находиться в оперативной памяти. Значимые типы храняться в стеке. А где храниться стек? Тоже в...

Типы значения и ссылочные типы
Здравствуйте. Мог бы кто-нибудь простыми словами объяснить что такое типы значения и ссылочные типы применительно к структурам? ...

Системным администраторам посвящается, и всем спецам
Благодарю авторов и создателей этого ресурса. В свое время мне очень помогли с информацией. cwyf76HDPfo

Ссылочные типы
Написать логическую функцию Search(T,c,i,j), определяющую, входит ли литера с в текст Т, и, если входит, присваивающую параметрам i и j...


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru