Как зайти в Даркнет?!
25th January, 01:11
5
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как управляемая память .net обрабатывает типы значений внутри объектов?
public class MyClass
{
public int Age;
public int ID;
}
public void MyMethod()
{
MyClass m = new MyClass();
int newID;
}
public class MyClass
{
public int Age;
public int ID;
}
public void MyMethod()
{
MyClass m = new MyClass();
int newID;
}
Насколько я понимаю, верно следующее:
- Ссылка m живет в стеке и выходит из области видимости при выходе MyMethod().
- Тип значения newID живет в стеке и выходит за пределы области действия при выходе MyMethod().
- Объект, созданный оператором new, живет в куче и становится возвращаемым GC, когда MyMethod() завершает работу, предполагая, что никакой другой ссылки на объект не существует.
Вот мой вопрос:
- Существуют ли типы значений внутри объектов в стеке или куче?
- Является ли бокс / распаковка типов значений в объекте проблемой?
- Есть ли какие-либо подробные, но понятные ресурсы по этой теме?
Логически я бы предположил, что типы значений внутри классов будут находиться в куче, но я не уверен, что они должны быть упакованы, чтобы попасть туда.
Редактировать:
Рекомендуемое чтение для этой темы:
Значения типа Value для класса должны жить вместе с экземпляром объекта в управляемой куче. Стек потока для метода живет только в течение срока действия метода; как может сохраняться значение, если оно существует только в этом стеке?
Размер объекта класса в управляемой куче - это сумма его полей типа значения, указателей ссылочного типа и дополнительных служебных переменных CLR, таких как индекс блока синхронизации. Когда кто-то присваивает значение полю типа значения объекта, CLR копирует это значение в пространство, выделенное внутри объекта для этого поля particluar.
Возьмем, к примеру, простой класс с одним полем.
public class EmbeddedValues
{
public int NumberField;
}
А вместе с ним и простой тестовый класс.
public class EmbeddedTest
{
public void TestEmbeddedValues()
{
EmbeddedValues valueContainer = new EmbeddedValues();
valueContainer.NumberField = 20;
int publicField = valueContainer.NumberField;
}
}
Если вы используете дизассемблер MSIL, предоставленный платформой .NET SDK, чтобы заглянуть в код IL для EmbeddedTest.TestEmbeddedValues()
.method public hidebysig instance void TestEmbeddedValues() cil managed
{
// Code size 23 (0x17)
.maxstack 2
.locals init ([0] class soapextensions.EmbeddedValues valueContainer,
[1] int32 publicField)
IL_0000: nop
IL_0001: newobj instance void soapextensions.EmbeddedValues::.ctor()
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: ldc.i4.s 20
IL_000a: stfld int32 soapextensions.EmbeddedValues::NumberField
IL_000f: ldloc.0
IL_0010: ldfld int32 soapextensions.EmbeddedValues::NumberField
IL_0015: stloc.1
IL_0016: ret
} // end of method EmbeddedTest::TestEmbeddedValues
Обратите внимание, что CLR сообщается stfld загруженное значение "20" в стеке в расположение загруженного поля EmbeddValues' NumberField, непосредственно в управляемую кучу. Аналогично, при извлечении значения он использует инструкцию ldfld для прямого копирования значения из этого расположения управляемой кучи в стек потоков. При этих типах операций не происходит никакой распаковки/распаковки коробки.
Лучший ресурс, который я видел для этого, - это книга CLR через C# Джеффри Рихтера. Это хорошо стоит прочитать, если вы делаете какие-либо разработки .NET. Исходя из этого текста, я понимаю, что типы значений в ссылочном типе действительно живут в куче, встроенной в родительский объект. Ссылочные типы всегда находятся в куче. Бокс и распаковка не симметричны. Бокс может быть более серьезной проблемой, чем распаковка. Для бокса потребуется скопировать содержимое типа значения из стека в кучу. В зависимости от того, как часто это происходит с вами, возможно, нет смысла иметь структуру вместо класса. Если у вас есть какой-то критический для производительности код, и вы не уверены, происходит ли бокс и распаковка, используйте инструмент для изучения кода IL вашего метода. Вы увидите слова box и unbox в IL. Лично я бы измерил производительность моего кода и только потом увидел, является ли это кандидатом на беспокойство. В вашем случае я не думаю, что это будет такой критический вопрос. Вам не придется копировать данные из стека в кучу (поле) каждый раз, когда вы обращаетесь к этому типу значений внутри ссылочного типа. Именно в этом случае бокс становится более значимой проблемой.
- Ans#1: куча. Коробка перефразирование не с превосходнейшей основных .Net Том 1'
Ссылочные типы (RT) всегда дают экземпляры, выделенные в куче. Напротив, типы значений (VT) зависят от контекста - если локальный var является VT, то CLR выделяет память в стеке. Если поле в классе является членом VT, то CLR выделяет память для экземпляра как часть макета объекта / типа, в котором объявлено поле.
Ans#2: нет. Бокс будет происходить только тогда, когда вы обращаетесь к структуре с помощью ссылки на объект / указателя интерфейса. obInstance.VT_typedfield не будет боксировать.
Переменная RT содержит адрес объекта, на который она ссылается. 2 RT var может указывать на один и тот же объект. Напротив, переменные VT - это сами экземпляры. 2 VT var не может указывать на один и тот же объект (struct)
Ans#3: Дон бокс эссенциальный .net / Джеффри Рихтер CLR через C#. у меня есть копия первого... хотя более поздние версии могут быть более обновлены для .Net ревизий
Ссылочные типы (RT) всегда дают экземпляры, выделенные в куче. Напротив, типы значений (VT) зависят от контекста - если локальный var является VT, то CLR выделяет память в стеке. Если поле в классе является членом VT, то CLR выделяет память для экземпляра как часть макета объекта / типа, в котором объявлено поле.
Ans#2: нет. Бокс будет происходить только тогда, когда вы обращаетесь к структуре с помощью ссылки на объект / указателя интерфейса. obInstance.VT_typedfield не будет боксировать.
Переменная RT содержит адрес объекта, на который она ссылается. 2 RT var может указывать на один и тот же объект. Напротив, переменные VT - это сами экземпляры. 2 VT var не может указывать на один и тот же объект (struct)
Ans#3: Дон бокс эссенциальный .net / Джеффри Рихтер CLR через C#. у меня есть копия первого... хотя более поздние версии могут быть более обновлены для .Net ревизий
Существуют ли типы значений внутри объектов в стеке или куче?
Существуют ли типы значений внутри объектов в стеке или куче?
В куче. Они являются частью выделения контура объекта, так же как и указатели для хранения ссылок.
Является ли бокс / распаковка типов значений в объекте проблемой?
Здесь нет никакого бокса.
Есть ли какие-либо подробные, но понятные ресурсы по этой теме?
+1 голос за книгу Рихтера.
Переменная или другое место хранения типа структуры-это совокупность открытых и закрытых полей экземпляра этого типа. Дано
struct Foo {public int x,y; int z;}
объявление Foo bar; приведет к тому , что bar.x , bar.y и bar.z будут храниться там, где будет храниться bar . Добавление такого объявления bar в класс с точки зрения компоновки хранилища будет эквивалентно добавлению трех полей int . Действительно, если вы никогда ничего не делали с bar , кроме доступа к его полям , поля bar будут вести себя так же , как и три поля bar_x, bar_y и bar_cantaccessthis_z [доступ к последнему потребует выполнения действий с bar , отличных от доступа к его полям, но он будет занимать пространство, независимо от того, используется ли он вообще для чего-либо].
Распознавание хранилищ структурного типа как агрегатов полей является первым шагом к пониманию структур. Попытка рассматривать их как удерживающие какой-то объект может показаться "simpler", но не соответствует тому, как они на самом деле работают.