C# всегда ли управляемые типы находятся в куче и собираются в мусор?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 C# всегда ли управляемые типы находятся в куче и собираются в мусор?

Сообщение Anonymous »

Рассмотрим следующий пример:

Код: Выделить всё

private struct NormalStruct
{
public bool MyBool;
}
...
public void TestMethod()
{
long valA = GC.GetAllocatedBytesForCurrentThread();
NormalStruct normalStruct = new();
long valB = GC.GetAllocatedBytesForCurrentThread();

long allocatedByteCount = valB - valA;

// No allocation on the heap
Assert.IsTrue(allocatedByteCount == 0);

unsafe
{
// No warnings
NormalStruct* ptr = &normalStruct;
}
}
Похоже, что NormalStruct выделяет память не в куче, а в стеке. Небольшой фрагмент небезопасного кода также сообщает нам, что NormalStruct не является управляемым объектом, поскольку в противном случае он бы об этом предупреждал.
Поэтому в этом случае я думаю, что NormalStruct избежит сборки мусора
А теперь рассмотрим другой пример

Код: Выделить всё

private struct ManagedStruct
{
public bool MyBool;

// Introducing a string in the struct to make it managed
public string MyString;
}
...
public void TestMethod()
{
long valA = GC.GetAllocatedBytesForCurrentThread();
ManagedStruct managedStruct = new();
long valB = GC.GetAllocatedBytesForCurrentThread();

long allocatedByteCount = valB - valA;

// Still no allocation on the heap
Assert.IsTrue(allocatedByteCount == 0);

unsafe
{
// Here a warning says that managedStruct is managed
//  Warning CS8500: This takes the address of, gets the size of, or declares a pointer to a managed type
ManagedStruct * ptr = &managedStruct;
}
}
Небезопасный код говорит нам, что ManagedStruct действительно является управляемым объектом!
Я считал само собой разумеющимся, что каждый управляемый объект размещается в куче, оказывается, я ошибался?
GC.GetAllocatedBytesForCurrentThread измеряет распределение в управляемой куче.
Почему здесь ничего не отображается, означает ли это, что ManagedStruct выделен в стеке?
И вопрос, на который мне действительно нужен ответ: попадут ли экземпляры ManagedStruct в сборщик мусора?

Подробнее здесь: https://stackoverflow.com/questions/792 ... -collected
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Когда объекты собираются мусор в Python?
    Anonymous » » в форуме Python
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Управляемые ресурсы — только ссылочные типы .NET или также типы значений и мои собственные классы? [дубликат]
    Anonymous » » в форуме C#
    0 Ответы
    53 Просмотры
    Последнее сообщение Anonymous
  • Есть ли способ узнать, какие пиксели на экране находятся в тени, а какие пиксели не находятся внутри сценария Unity C#?
    Anonymous » » в форуме C#
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Visual Studio отображает ошибки, даже если проекты собираются
    Гость » » в форуме C#
    0 Ответы
    22 Просмотры
    Последнее сообщение Гость
  • Программирование на языке Си! кодеры собираются [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»