Какво означава разпределено вградено в структурата за Value-Types?

От MSDN се казва Типовете стойности се разпределят в стека или вградени.

Разпределеното вградено означава ли, че типът стойност може да бъде разпределен веднага след мястото, където е деклариран? Кажете, че ако е деклариран в Heap, тогава той се разпределя в следващия слот на Heap?

Тогава защо пише в структура?

Актуализация

ако структурата конкретно означава структура, защо не споменава нищо относно клас? като поле в 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 Вероятно се цепя - тълкувам inline, за да означава, където и да е това съдържащо нещо, което се отнася еднакво и за двете. В случай на клас може да се твърди, че той е вграден, въпреки че винаги е в купчината. В случай на структура, това в крайна сметка може да бъде структура или купчина. - 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