Inkvee![]() | Изменение полей структуры. стэк, хип1680286960 Добрый день.
У меня вопрос по структурам и их хранению в памяти.
Предположим у меня есть структура с полем
. Вопрос: если я изменю значение этого поля будет ли создана новая структура с новым значением с присвоением старого адреса или просто значение по адресу изменится? (как, например, работает тип строки)
Я не смог нагуглить ответ и не знаю как это можно проверить самому
Зачем мне это надо:
Итерировать много данных у много объектов. На некоторых компиляторах стэк работает значительно быстрее. |
IamRain![]() | Любую достаточно развитую технологию не отличить от магии (С) Артур Ч. Кларк 1680287107 Inkvee,
«будет ли создана новая структура с новым значением с присвоением старого адреса»
Зачем ее создавать, эту новую структуру, к тому же назначать старый адрес? Inkvee![]() ![]() |
freeba![]() | Code, Debug, Love the Emperor! 1680287611 int это ValueType - он не хранится в куче. Соответственно в структуре выделено под него четыре байта - которые и меняются при присваивании нового значения. Inkvee![]() ![]() |
Inkvee![]() | 1680287736 IamRain,« Зачем ее создавать, эту новую структуру, к тому же назначать старый адрес?»
Ну, если бы у меня было дополнительно поле строки "Вася". Я бы захотел изменить значение на "кВася", то старая строка бы удалилась, и на ее месте создалась бы новая, с новым значением по старому адресу.
Мой вопрос будет ли такое же поведение у структуры, которая является значимым типом? влепить жирный лайк![]() |
IamRain![]() | Любую достаточно развитую технологию не отличить от магии (С) Артур Ч. Кларк 1680287925 Inkvee, «Мой вопрос будет ли такое же поведение у структуры, которая является значимым типом?»
Поле значимого типа (int), объявленное в структуре, занимает часть памяти этой структуры, и при перезаписи этого значения вы просто меняете значение в памяти.
Другое дело со строками. Строки - иммутабельный тип, это значит, что любая операция на изменение содержимого этой строки не изменяет эту строку, но создает новую строку.
После изменения переменной строкового типа в структуре, поле будет возвращать уже ссылку на новую строку.
«с новым значением по старому адресу.»
Нет, строки иммутабельны, это значит, что не будет старого адреса, будет новая строка, с новым адресом.
То, что вы называете старым адресом - это просто поле, хранящее ссылку. Эта ссылка изменится.
«Итерировать много данных у много объектов.»
Структуры имеет смысл использовать в коллекциях в тех случаях, когда важно задействовать L1-L3 кэши процессора, в таком случае говорят "обеспечить высокую плотность размещения объектов в памяти". Правда, надо быть уверенным, что непрерывного свободного пространства под коллекцию структур хватает.
В случае массива ссылок - да, эти ссылки тоже кэшируются, но фактическое то размещение данных в памяти неизвестно, скорее всего неплотное. То есть тут все еще нужно прыгнуть на ту область в памяти, куда указывает ссылка. То есть использование кэша тут не дает никакого преимущества. Inkvee![]() ![]() |
colorotur![]() | 1680288133 Inkvee, «если я изменю значение этого поля будет ли создана новая структура с новым значением с присвоением старого адреса или просто значение по адресу изменится?»
Переменная — это участок памяти, в которой можно хранить значения в соответсвии с типом этой переменной.
Структура (значимый тип) отличается от класса (ссылочного типа) тем, что хранится в переменной этого типа.
В переменных значимых типов хранится экземпляр, в переменных ссылочных типов — ссылка на экземпляр.
Поскольку int — значимый тип, постольку значением переменной является экземпляр, а не ссылка, значит и присвоений адресов не будет.
freeba,
«int это ValueType - он не хранится в куче.»
А где хранится int, являющийся элементом массива?
Являющийся полем класса?
Объявленный в блоке итератора?
Объявленный в асинхронном методе?
Захваченный анонимным методом?
И т.д. Inkvee![]() ![]() |