Структуры, кучи и стеки — управление памятью

Я читал книгу о C# и наткнулся на тему хранения значений в памяти. Экземпляр ссылочного типа всегда создается в куче, однако значение переменной сохраняется везде, где оно объявлено. Только локальные переменные (переменные, объявленные в методах [не анонимные]) и параметры метода живут в стеке.

Итак, мой вопрос: если я объявлю эти структуры как такие локальные переменные, будут ли они все помещены в стек?

struct A<T> where T : struct { }

struct B<T> where T : class { }

struct C { }

Мне просто интересно, может ли содержимое struct влиять на то, где оно будет храниться в памяти.

Спасибо, гуру С#!


person Patryk Golebiowski    schedule 29.07.2015    source источник
comment
Это будет один из тех вопросов, которые сложнее, чем этот, будьте уверены, вам не нужно знать, как .Net реализован для использования С#. Хотя, пожалуй, любопытство не помешает.   -  person Jodrell    schedule 29.07.2015
comment
Обязательная ссылка «Стек является деталью реализации»: blogs.msdn.com/b/ericlippert/archive/2009/04/27/   -  person Rotem    schedule 29.07.2015
comment
Связано: stackoverflow.com/questions /1113819/ (обратите внимание на некоторые комментарии, которые исправляют ответ)   -  person D Stanley    schedule 29.07.2015
comment
И часть 2 этой замечательной записи в блоге Эрика Липперта blogs.msdn.com/b/ericlippert/archive/2009/05/04/   -  person Nikolai Samteladze    schedule 29.07.2015
comment
Я думаю, что интересный вопрос здесь заключается в том, влияет ли struct контент на то, где он хранится. Помимо этого, где находится struct, это деталь реализации. В большинстве случаев это стек, но они могут быть и в куче (поля класса, асинхронные блоки, блоки итераторов и т. д.). Вы также можете найти это обсуждение SO интересным -heap-net" title="почему структуры хранятся в стеке, а классы хранятся в сети кучи"> stackoverflow.com/questions/815354/   -  person Nikolai Samteladze    schedule 29.07.2015


Ответы (1)


структуры идут туда, куда вы им говорите.

Если они объявлены как локальные переменные в функции, то они находятся в стеке. Если они являются членами класса, то они встроены в динамическую память класса.

Если структура содержит класс, то ссылка встраивается в структуру так же, как если бы она была int или любым другим членом. То, на что ссылается класс, находится в куче

person pm100    schedule 29.07.2015