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

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

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

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

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

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

Возможно происходит неявный боксинг при выходе. но не припоминаю, чтобы хоть в одной книге конкретно об этом моменте было написано.
...
Рейтинг: 0 / 0
05.08.2016, 12:58
    #39287096
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic List of structs
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
05.08.2016, 13:01
    #39287102
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic List of structs
Вот исходник List<T> . Обычный класс. Вот хранилище
Код: c#
1.
private T[] _items;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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