Что означает выделенный встроенный элемент в структуре для типов значений?

В MSDN указано, что типы значений размещаются в стеке или встроены.

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

Тогда почему это сказано в структуре?

Обновлять

если структура конкретно означает структуру, почему в ней ничего не упоминается о классе? как поле в Class, оно не находится в стеке и не встроено в struct (оно встроено в class).


person colinfang    schedule 27.04.2012    source источник
comment
Даже для выделенной памяти кучи выделяется фиксированный объем. Типы значений (для элементов с типом значений) живут в этой выделенной памяти, а не в другом сегменте. (Тип значения, названный типом объекта или типом интерфейса, размещается в другом сегменте.)   -  person    schedule 28.04.2012


Ответы (2)


Они выделяются внутри в структуре, то есть как часть памяти, уже выделенной для структуры.

Видеть:

http://msdn.microsoft.com/en-us/library/system.valuetype.aspx

Если бы у вас были вложенные типы значений, внутренний тип был бы выделен в памяти, уже выделенной для содержащего его типа.

struct Inner
{
    public int A;
}

struct Outer
{
    public Inner I;
    public int B;
}

Outer o = new Outer();
o.I = new Inner();

Память для I выделяется встроенно в память, выделенную для экземпляра Outer.

person Eric J.    schedule 27.04.2012
comment
Или, действительно, как поле в классе. Не только на конструкции, - person Marc Gravell; 28.04.2012
comment
@MarcGravell хм, почему тогда в предложении говорится только о структуре, а не о структуре или классе, см. мое рассматриваемое обновление - person colinfang; 28.04.2012
comment
@colinfang Я, вероятно, путаю волосы - я интерпретирую встроенное значение как означающее, где бы ни находилась эта содержащая вещь, что в равной степени относится к обоим. В случае с классом можно утверждать, что он встроенный, хотя всегда находится в куче. В случае структуры это может быть структура или куча. - person Marc Gravell; 28.04.2012
comment
@MarcGravell Вы имели в виду, что в случае структуры это может быть стек или куча? - person Marson Mao; 07.08.2015

Простейший способ представить структуру — это группа мест хранения, склеенных вместе клейкой лентой. Объявление переменной или поля Point foo; по сути эквивалентно произнесению int Point_X; int Point_Y;. Произнесение foo = bar;, когда оба имеют тип Point, по существу эквивалентно произнесению foo_X = bar_X; foo_Y = bar_Y;. Передача структуры в качестве параметра значения по сути эквивалентна передаче всех ее полей (общедоступных и закрытых) в качестве параметров значения.

Есть два структурных и один в основном синтаксический сахарный способ, в котором структура представляет собой нечто большее, чем группа полей, склеенных клейкой лентой:

  1. It is possible to pass a struct as a `byref` parameter, in which case the system passes one reference to the whole group of storage locations (as distinct from passing the storage locations individually, as effectively happens when passing by value).
  2. Each slot of an array of a struct type will hold all its storage locations together, so `Point foo[];` is very different from `int foo_X[]; int foo_Y[];`. The former declaration represents one array with two storage locations per element, while the latter represents two arrays with one storage location per element.
  3. It is possible to associated methods and properties with a struct, and to define struct fields which can only be accessed either through those methods and properties, or by performing an operation like assignment on all fields of a struct together.

Типы классов сильно отличаются от структур. Если объявить класс с полями P и Q, а также объявить место хранения этого типа класса, это место хранения не будет содержать две вещи (P и Q). Он будет содержать только одну вещь — ссылку на объект, хранящийся в другом месте, который сам имеет поля P и Q.

person supercat    schedule 17.05.2012