powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Generic List of structs
25 сообщений из 41, страница 1 из 2
Generic List of structs
    #39287046
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проясните один моментик пожалуйста.

Якобы структуры помещаемые в Generic List не боксируются. В связи с чем не понятно два момента
1. Сам List<T> класс. И значит находится в куче, но он хранит ссылки на структуры, т.е. мы имеем в куче список с указателями по факту, а сами структуры в стеке ? Не помню можно ли иметь указатели на переменные в стеке, но вроде нет - там оперируют смещением от начала фрейма стека. Соответственно хочу понять как это устроена.

2. Если метод описан как
List<MyStruct> MyFunc ()

То как происходит возврат структур из стека этого метода проястните пожалуйста. Насколько я знаю по теории, при выходе из метода со стека просто снимается весь фрейм с переменными этого метод. Но ведь мы сохраняем структуры, как они выживают, происходит некоторое неявное копирование ? В книгах данный момент не проясняется вроде.
...
Рейтинг: 0 / 0
Generic List of structs
    #39287070
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В основе List<T> - массив. Массив лежит в куче.
ЕМНИП структуры отличаются от классов только тем что могут лежать как в стеке так и в куче. Объекты только в куче. У Рихтера хорошо расписано.
...
Рейтинг: 0 / 0
Generic List of structs
    #39287074
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕМНИП структуры отличаются от классов только тем что могут лежать как в стеке так и в куче.
Поправлю пока помидорами не закидали :)
...
Рейтинг: 0 / 0
Generic List of structs
    #39287082
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Хотите сказать, что рекламная фраза "generic list для value type хороши именно тем, что не боксируют эти value type" ложь ? Все эти годы нам врали и утверждали, что именно для этого и был создан generic List ? :)

Я знаю, что List внутри себя хранит массив. Мне не ясно, где это "внутри себя" находится, если классы хранятся в куче - они и массив хранят там же ? Как выживают value type хранящиеся в этих массивах при выходе из метода.

Возможно происходит неявный боксинг при выходе. но не припоминаю, чтобы хоть в одной книге конкретно об этом моменте было написано.
...
Рейтинг: 0 / 0
Generic List of structs
    #39287096
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
struct Foo
{
  public int Bar;
  public void SetBar(int bar)
  {
    Bar = bar;
  }
}
class Program
{
  static void Main()
  {
    var f = new Foo {Bar = 123};
    var l = new List<Foo> {f};
    f.Bar = 789;
    Console.WriteLine(l[0].Bar); // ?
    l[0].SetBar(456);
    Console.WriteLine(l[0].Bar); // ?
  }
}


- угадайте, что будет в консольном выводе.

А сами значения структур, хранящихся в коллекции, вполне себе находятся в куче. Утверждение "объекты хранятся в куче, а структуры - на стеке" справедливо только для локальных переменных, в общем случае оно неверно. Подробности см. здесь .
...
Рейтинг: 0 / 0
Generic List of structs
    #39287102
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот исходник List<T> . Обычный класс. Вот хранилище
Код: c#
1.
private T[] _items;


ИМХУ в рамках этой темы дальше можно забыть про List<T> и рассуждать об особенностях хранения массива. ХЗ как оно реально реализовано. Не вникал. Возможно без боксинга.
Как вариант можно написать демо-пример и посмотреть IL-код на предмет боксинга.

По теме боксинга у меня у самого есть вопрос: в чем его суть, для чего эта операция нужна?
...
Рейтинг: 0 / 0
Generic List of structs
    #39287121
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПо теме боксинга у меня у самого есть вопрос: в чем его суть, для чего эта операция нужна?

Размер стека ограничен. Но обращение с ним происходит намного быстрее чем обращение к куче (поиск по указателю).
Поэтому простые типы + структуры + указатель на string хранятся на стеке. Чтобы программа быстрее работала.
Ну а reference type считаются большими, заполонят весь стек и программа упадет с ошибкой заполнения стека. Чтобы не было такого риска они хранятся в куче а в стеке остается указатель на этот объект.
Есть момент - структуры тоже могу быть очень большими. Нужно стремится делать их маленькими, чтобы не исчерпать стек. Или переводить их в класс, если растут и угрожают стеку. Просто помнить об этой особенности.
...
Рейтинг: 0 / 0
Generic List of structs
    #39287128
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
До, гм, кучи: 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.
Боксинг значимых элементов массива не нужен потому, что боксинг вообще нужен для доступа к значимой переменной, лежащей в куче - но в случае массива мы можем получить доступ к этой переменной через ссылку на сам массив+индекс элемента. Поэтому боксинг в данном случае и не делается.
...
Рейтинг: 0 / 0
Generic List of structs
    #39287129
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

Вроде бы Generic List пропагандируется как не боксирующий value type. Мол в этом его преимущество (кроме типобезопасности). А вы говорите, что он банально боксируется.
Мне вот стало не понятно поэтому и задал вопрос.
...
Рейтинг: 0 / 0
Generic List of structs
    #39287131
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekуказатель на string хранятся на стеке
Указатель в кучу на любую локальную переменную ссылочного типа хранится на стеке.
...
Рейтинг: 0 / 0
Generic List of structs
    #39287132
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekА вы говорите, что он банально боксируется.
Приведите цитату, где я это говорю.
...
Рейтинг: 0 / 0
Generic List of structs
    #39287136
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotek,
автор Сам List<T> класс. И значит находится в куче, но он хранит ссылки на структуры
вы откуда тут взялись? с явы что ли мигрировали, там да если List<int> получишь з. на воротник, ( они говорят у нас боксируется -
но боксируется очень быстро ( с пафосом так))
...
Рейтинг: 0 / 0
Generic List of structs
    #39287138
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekРазмер стека ограничен. Но обращение с ним происходит намного быстрее чем обращение к куче поиск по указателю
поиска нет - есть обращение по адресу.
...
Рейтинг: 0 / 0
Generic List of structs
    #39287139
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныУказатель в кучу на любую локальную переменную ссылочного типа хранится на стеке.
Я просто подчеркнул особенность строки. Мало кто пишет о том, что string это reference type по сути. Только еще и не изменяемый.
...
Рейтинг: 0 / 0
Generic List of structs
    #39287141
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekDima T,

Хотите сказать, что рекламная фраза "generic list для value type хороши именно тем, что не боксируют эти value type" ложь ? Все эти годы нам врали и утверждали, что именно для этого и был создан generic List ? :)

Я знаю, что List внутри себя хранит массив. Мне не ясно, где это "внутри себя" находится, если классы хранятся в куче - они и массив хранят там же ? Как выживают value type хранящиеся в этих массивах при выходе из метода.

Возможно происходит неявный боксинг при выходе. но не припоминаю, чтобы хоть в одной книге конкретно об этом моменте было написано.
Ой ЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁ!!!!!!!!!!!!!!!!
1. Нафига придумали структуры и классы? Вообще говоря размер класса нельзя/не так просто определить в момент компиляции, а размер структуры можно! Это значит что выделением памяти для классов управляет GC, а для структур.... Компилятор! Что на порядки быстрее!
2. Массив объектов хранит ссылки на объекты, массив структур - сами структуры и все это в куче.
3. Ну и если структура поле класса - она тоже лежит в куче.
...
Рейтинг: 0 / 0
Generic List of structs
    #39287144
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныПриведите цитату, где я это говорю.

Сон Веры ПавловныList<T>, где T - value type, хранит копии значений.
...
А сами значения структур, хранящихся в коллекции, вполне себе находятся в куче.

Если я не верно воспринял эти фразы как боксинг, то это моя ошибка. Ок не буду спорить.
...
Рейтинг: 0 / 0
Generic List of structs
    #39287147
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВВообще говоря размер класса нельзя/не так просто определить в момент компиляции
откуда этот бред?

дальше даже читать неинтересно
...
Рейтинг: 0 / 0
Generic List of structs
    #39287149
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotek,

почитай Рихтера, он много букав написал по этому поводу. Сам никак не соберусь перечитать, т.к. многое не допонял в этом вопросе, когда читал.
...
Рейтинг: 0 / 0
Generic List of structs
    #39287150
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем. Если ответ на мой вопрос "generic List со всем своим содержимым из Value type хранится в куче" - то тему можно закрывать.
Мне только это и было не понятно. Я почему то верил в то, что Generic List создан именно для того, чтобы избежать боксинга. Кажется это достаточно распространенный факт - но получается ложный.

Не зная этого я и начал фантазировать на тему того, как из кучи можно держать ссылки на структуры в стеке. Вот и все.
Сон Веры ПавловныПеречтайте внимательно еще раз то, что написали. Ссылки. На структуры. ОМГ.
...
Рейтинг: 0 / 0
Generic List of structs
    #39287153
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotek, вы чтой-то не догоняете в терминологии... про боксинг-унбоксинг...
...
Рейтинг: 0 / 0
Generic List of structs
    #39287154
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buserProBiotek, вы чтой-то не догоняете в терминологии... про боксинг-унбоксинг...
++
...
Рейтинг: 0 / 0
Generic List of structs
    #39287157
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotek, ну и что такое ссылка/указатель похду тож...
...
Рейтинг: 0 / 0
Generic List of structs
    #39287158
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotek,

боксинг подразумевает возврат ссылки на каждое конкретное боксируемое значение, и дальнейшую работу с этим значением через полученную ссылку аналогично работе со ссылочными типами. В случае массива, как я писал выше, доступ к значениям осуществляется через ссылку на сам массив+индекс в массиве, на каждый отдельный элемент массива ссылка не нужна, поэтому никакого боксинга нет, несмотря на расположение самих элементов в куче.
...
Рейтинг: 0 / 0
Generic List of structs
    #39287161
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в принципе можно освежить память
struct A{};
A* array= (A *) malloc(sizeof(A) * 2)
A** array_ref= (A **) malloc(sizeof(A*) * 2);
...
Рейтинг: 0 / 0
Generic List of structs
    #39287172
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныProBiotek,

боксинг подразумевает возврат ссылки на каждое конкретное боксируемое значение, и дальнейшую работу с этим значением через полученную ссылку аналогично работе со ссылочными типами. В случае массива, как я писал выше, доступ к значениям осуществляется через ссылку на сам массив+индекс в массиве, на каждый отдельный элемент массива ссылка не нужна, поэтому никакого боксинга нет, несмотря на расположение самих элементов в куче.

Разве тот факт, что массив оказался в куче не является самим понятием боксинга?
Я понимаю, что ссылку нужно хранить только на сам массив а не на каждый его элемент. Но что-то вы прям совсем путаете говоря, что "нахождение массива в куче не является боксингом".

По моему это и есть именно что боксинг и тогда становится понятно как устроена функция
List<MyStruct> MyFunc ()
...
Рейтинг: 0 / 0
25 сообщений из 41, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Generic List of structs
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]