|
Generic List of structs
|
|||
---|---|---|---|
#18+
Проясните один моментик пожалуйста. Якобы структуры помещаемые в Generic List не боксируются. В связи с чем не понятно два момента 1. Сам List<T> класс. И значит находится в куче, но он хранит ссылки на структуры, т.е. мы имеем в куче список с указателями по факту, а сами структуры в стеке ? Не помню можно ли иметь указатели на переменные в стеке, но вроде нет - там оперируют смещением от начала фрейма стека. Соответственно хочу понять как это устроена. 2. Если метод описан как List<MyStruct> MyFunc () То как происходит возврат структур из стека этого метода проястните пожалуйста. Насколько я знаю по теории, при выходе из метода со стека просто снимается весь фрейм с переменными этого метод. Но ведь мы сохраняем структуры, как они выживают, происходит некоторое неявное копирование ? В книгах данный момент не проясняется вроде. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 12:17 |
|
Generic List of structs
|
|||
---|---|---|---|
#18+
В основе List<T> - массив. Массив лежит в куче. ЕМНИП структуры отличаются от классов только тем что могут лежать как в стеке так и в куче. Объекты только в куче. У Рихтера хорошо расписано. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 12:39 |
|
Generic List of structs
|
|||
---|---|---|---|
#18+
Dima TЕМНИП структуры отличаются от классов только тем что могут лежать как в стеке так и в куче. Поправлю пока помидорами не закидали :) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 12:41 |
|
Generic List of structs
|
|||
---|---|---|---|
#18+
Dima T, Хотите сказать, что рекламная фраза "generic list для value type хороши именно тем, что не боксируют эти value type" ложь ? Все эти годы нам врали и утверждали, что именно для этого и был создан generic List ? :) Я знаю, что List внутри себя хранит массив. Мне не ясно, где это "внутри себя" находится, если классы хранятся в куче - они и массив хранят там же ? Как выживают value type хранящиеся в этих массивах при выходе из метода. Возможно происходит неявный боксинг при выходе. но не припоминаю, чтобы хоть в одной книге конкретно об этом моменте было написано. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 12:47 |
|
Generic List of structs
|
|||
---|---|---|---|
#18+
ProBiotekно он хранит ссылки на структуры Перечтайте внимательно еще раз то, что написали. Ссылки. На структуры. ОМГ. List<T>, где T - value type, хранит копии значений. С этим связаны известные грабли хранения в листе мутабельных структур: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
- угадайте, что будет в консольном выводе. А сами значения структур, хранящихся в коллекции, вполне себе находятся в куче. Утверждение "объекты хранятся в куче, а структуры - на стеке" справедливо только для локальных переменных, в общем случае оно неверно. Подробности см. здесь . ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 12:58 |
|
Generic List of structs
|
|||
---|---|---|---|
#18+
Вот исходник List<T> . Обычный класс. Вот хранилище Код: c# 1.
ИМХУ в рамках этой темы дальше можно забыть про List<T> и рассуждать об особенностях хранения массива. ХЗ как оно реально реализовано. Не вникал. Возможно без боксинга. Как вариант можно написать демо-пример и посмотреть IL-код на предмет боксинга. По теме боксинга у меня у самого есть вопрос: в чем его суть, для чего эта операция нужна? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 13:01 |
|
Generic List of structs
|
|||
---|---|---|---|
#18+
Dima TПо теме боксинга у меня у самого есть вопрос: в чем его суть, для чего эта операция нужна? Размер стека ограничен. Но обращение с ним происходит намного быстрее чем обращение к куче (поиск по указателю). Поэтому простые типы + структуры + указатель на string хранятся на стеке. Чтобы программа быстрее работала. Ну а reference type считаются большими, заполонят весь стек и программа упадет с ошибкой заполнения стека. Чтобы не было такого риска они хранятся в куче а в стеке остается указатель на этот объект. Есть момент - структуры тоже могу быть очень большими. Нужно стремится делать их маленькими, чтобы не исчерпать стек. Или переводить их в класс, если растут и угрожают стеку. Просто помнить об этой особенности. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 13:11 |
|
Generic List of structs
|
|||
---|---|---|---|
#18+
До, гм, кучи: https://blogs.msdn.microsoft.com/ericlippert/2010/09/30/the-truth-about-value-types/ It is frequently the case that array elements, fields of reference types, locals in an iterator block and closed-over locals of a lambda or anonymous method must live longer than the activation period of the method that first required the use of their storage. And even in the rare cases where their lifetimes are shorter than that of the activation of the method, it is difficult or impossible to write a compiler that knows that. Therefore we must be conservative: all of these storage locations go on the heap. Боксинг значимых элементов массива не нужен потому, что боксинг вообще нужен для доступа к значимой переменной, лежащей в куче - но в случае массива мы можем получить доступ к этой переменной через ссылку на сам массив+индекс элемента. Поэтому боксинг в данном случае и не делается. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 13:15 |
|
Generic List of structs
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, Вроде бы Generic List пропагандируется как не боксирующий value type. Мол в этом его преимущество (кроме типобезопасности). А вы говорите, что он банально боксируется. Мне вот стало не понятно поэтому и задал вопрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 13:16 |
|
Generic List of structs
|
|||
---|---|---|---|
#18+
ProBiotekуказатель на string хранятся на стеке Указатель в кучу на любую локальную переменную ссылочного типа хранится на стеке. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 13:17 |
|
Generic List of structs
|
|||
---|---|---|---|
#18+
ProBiotekА вы говорите, что он банально боксируется. Приведите цитату, где я это говорю. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 13:18 |
|
Generic List of structs
|
|||
---|---|---|---|
#18+
ProBiotek, автор Сам List<T> класс. И значит находится в куче, но он хранит ссылки на структуры вы откуда тут взялись? с явы что ли мигрировали, там да если List<int> получишь з. на воротник, ( они говорят у нас боксируется - но боксируется очень быстро ( с пафосом так)) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 13:22 |
|
Generic List of structs
|
|||
---|---|---|---|
#18+
ProBiotekРазмер стека ограничен. Но обращение с ним происходит намного быстрее чем обращение к куче поиск по указателю поиска нет - есть обращение по адресу. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 13:23 |
|
Generic List of structs
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныУказатель в кучу на любую локальную переменную ссылочного типа хранится на стеке. Я просто подчеркнул особенность строки. Мало кто пишет о том, что string это reference type по сути. Только еще и не изменяемый. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 13:23 |
|
Generic List of structs
|
|||
---|---|---|---|
#18+
ProBiotekDima T, Хотите сказать, что рекламная фраза "generic list для value type хороши именно тем, что не боксируют эти value type" ложь ? Все эти годы нам врали и утверждали, что именно для этого и был создан generic List ? :) Я знаю, что List внутри себя хранит массив. Мне не ясно, где это "внутри себя" находится, если классы хранятся в куче - они и массив хранят там же ? Как выживают value type хранящиеся в этих массивах при выходе из метода. Возможно происходит неявный боксинг при выходе. но не припоминаю, чтобы хоть в одной книге конкретно об этом моменте было написано. Ой ЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁ!!!!!!!!!!!!!!!! 1. Нафига придумали структуры и классы? Вообще говоря размер класса нельзя/не так просто определить в момент компиляции, а размер структуры можно! Это значит что выделением памяти для классов управляет GC, а для структур.... Компилятор! Что на порядки быстрее! 2. Массив объектов хранит ссылки на объекты, массив структур - сами структуры и все это в куче. 3. Ну и если структура поле класса - она тоже лежит в куче. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 13:24 |
|
Generic List of structs
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныПриведите цитату, где я это говорю. Сон Веры ПавловныList<T>, где T - value type, хранит копии значений. ... А сами значения структур, хранящихся в коллекции, вполне себе находятся в куче. Если я не верно воспринял эти фразы как боксинг, то это моя ошибка. Ок не буду спорить. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 13:27 |
|
Generic List of structs
|
|||
---|---|---|---|
#18+
ЕвгенийВВообще говоря размер класса нельзя/не так просто определить в момент компиляции откуда этот бред? дальше даже читать неинтересно ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 13:32 |
|
Generic List of structs
|
|||
---|---|---|---|
#18+
ProBiotek, почитай Рихтера, он много букав написал по этому поводу. Сам никак не соберусь перечитать, т.к. многое не допонял в этом вопросе, когда читал. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 13:32 |
|
Generic List of structs
|
|||
---|---|---|---|
#18+
В общем. Если ответ на мой вопрос "generic List со всем своим содержимым из Value type хранится в куче" - то тему можно закрывать. Мне только это и было не понятно. Я почему то верил в то, что Generic List создан именно для того, чтобы избежать боксинга. Кажется это достаточно распространенный факт - но получается ложный. Не зная этого я и начал фантазировать на тему того, как из кучи можно держать ссылки на структуры в стеке. Вот и все. Сон Веры ПавловныПеречтайте внимательно еще раз то, что написали. Ссылки. На структуры. ОМГ. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 13:32 |
|
Generic List of structs
|
|||
---|---|---|---|
#18+
ProBiotek, вы чтой-то не догоняете в терминологии... про боксинг-унбоксинг... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 13:38 |
|
Generic List of structs
|
|||
---|---|---|---|
#18+
buserProBiotek, вы чтой-то не догоняете в терминологии... про боксинг-унбоксинг... ++ ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 13:38 |
|
Generic List of structs
|
|||
---|---|---|---|
#18+
ProBiotek, ну и что такое ссылка/указатель похду тож... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 13:39 |
|
Generic List of structs
|
|||
---|---|---|---|
#18+
ProBiotek, боксинг подразумевает возврат ссылки на каждое конкретное боксируемое значение, и дальнейшую работу с этим значением через полученную ссылку аналогично работе со ссылочными типами. В случае массива, как я писал выше, доступ к значениям осуществляется через ссылку на сам массив+индекс в массиве, на каждый отдельный элемент массива ссылка не нужна, поэтому никакого боксинга нет, несмотря на расположение самих элементов в куче. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 13:40 |
|
Generic List of structs
|
|||
---|---|---|---|
#18+
в принципе можно освежить память struct A{}; A* array= (A *) malloc(sizeof(A) * 2) A** array_ref= (A **) malloc(sizeof(A*) * 2); ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 13:41 |
|
Generic List of structs
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныProBiotek, боксинг подразумевает возврат ссылки на каждое конкретное боксируемое значение, и дальнейшую работу с этим значением через полученную ссылку аналогично работе со ссылочными типами. В случае массива, как я писал выше, доступ к значениям осуществляется через ссылку на сам массив+индекс в массиве, на каждый отдельный элемент массива ссылка не нужна, поэтому никакого боксинга нет, несмотря на расположение самих элементов в куче. Разве тот факт, что массив оказался в куче не является самим понятием боксинга? Я понимаю, что ссылку нужно хранить только на сам массив а не на каждый его элемент. Но что-то вы прям совсем путаете говоря, что "нахождение массива в куче не является боксингом". По моему это и есть именно что боксинг и тогда становится понятно как устроена функция List<MyStruct> MyFunc () ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 13:46 |
|
|
start [/forum/topic.php?fid=20&msg=39287129&tid=1400412]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
54ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 167ms |
0 / 0 |