Стекът е детайл от изпълнението или не?

Според http://msdn.microsoft.com/en-us/library/ms229017.aspx, типовете стойности се разпределят в стека или в линия с други структури*. И все пак в стекът е детайл за изпълнение, Ерик Липърт заявява, че това е детайл за изпълнение.

Доколкото разбирам, детайлът на внедряването е поведение, произведено от код, на който може да се разчита чрез консумиране на код, въпреки че това поведение не е определено от спецификацията, в която е написан кодът.. Разбирам, че документацията не е спецификация, макар че вероятно, ако нещо е посочено в документацията, можем да разчитаме на него и вече не е детайл за внедряване. И така, стекът детайл от изпълнението ли е или не?

*: Разбирам, че това означава, че структури могат също да бъдат разпределени вътре в други, вместо директно в купчината, въпреки че може и да греша.


person RCIX    schedule 29.12.2009    source източник
comment
свързано с въпрос: stackoverflow.com/questions /1970894/struct-what-is-it-for/   -  person Gabriel McAdams    schedule 29.12.2009
comment
Току-що маркирах това като дубликат преди малко :)   -  person RCIX    schedule 29.12.2009


Отговори (2)


Документацията на MSDN ви разказва за конкретната реализация, която Microsoft C# компилаторът използва за struct. Тези конкретни подробности не са в спецификацията на ECMA 334 C#; те не са част от семантиката на structs. Следователно тези подробности в документацията са подробности за изпълнението.

Изглежда си спомням, че прочетох някъде Ерик Липерт, който казва, че желае (или предпочита, не помня какво ниво на предпочитание е предоставил) документацията не споменава стека във връзка с structs. Ще видя дали мога да го изровя.

Ето го от публикацията в блога, към която сте дали връзка:

Съжалявам, че документацията не се фокусира върху това, което е най-подходящо; като се фокусираме върху до голяма степен неуместна подробност на изпълнението, ние увеличаваме важността на тази подробност на изпълнението и затъмняваме важността на това, което прави даден тип стойност семантично полезен. Много ми се иска всички тези статии, обясняващи какво е „стека“, вместо това да отделят време за обяснение какво точно означава „копирано по стойност“ и как неразбирането или неправилното използване на „копиране по стойност“ може да причини грешки.

Съответният раздел от спецификацията ECMA 334 C# е §11. Имайте предвид, че думата "стек" никога не се използва в този раздел. Разделът просто излага синтаксиса, че structs следват семантиката на стойността, че те са имплицитно запечатани и наследяват от System.ValueType, че присвояването на променлива от тип struct създава копие, че предаването на struct като параметър по стойност създава копие, как structs са зададени на стойности по подразбиране (всички полета за типове стойности в struct са зададени на техните стойности по подразбиране и всички полета за референтни типове са зададени на null), правилата около боксирането и разопаковането на struct, значението на this за structs и как инициализацията на полето, конструкторите, деструкторите и статичните конструктори работят за structs. Отново не се споменават стекове. някога.

Стекът е детайл на изпълнението, а не част от семантиката на struct.

person jason    schedule 29.12.2009

За типовете стойности на C# „стекът“ е детайл от изпълнението, тъй като всяка безопасна операция, извършена върху типа стойност, ще се държи по същия начин, ортогонално на това дали структурата е била разпределена в стека или в купчината.

Операциите, за които това би имало значение (т.е. в крайна сметка препращане към освободен стеков кадър), като вземане на адреса и директното му използване (напр. чрез наследени API), са опасни и погрешни употреби (т.е. неизползване на API за маршалинг ).

person Remus Rusanu    schedule 29.12.2009