Inkvee

ответов0 / помог0

Изменение полей структуры. стэк, хип

1680286960
Добрый день. У меня вопрос по структурам и их хранению в памяти. Предположим у меня есть структура с полем

int x=0
. Вопрос: если я изменю значение этого поля будет ли создана новая структура с новым значением с присвоением старого адреса или просто значение по адресу изменится? (как, например, работает тип строки) Я не смог нагуглить ответ и не знаю как это можно проверить самому Зачем мне это надо: Итерировать много данных у много объектов. На некоторых компиляторах стэк работает значительно быстрее.
IamRain
ответов2 / помог2
Любую достаточно развитую технологию не отличить от магии (С) Артур Ч. Кларк 1680287107
Inkvee, «будет ли создана новая структура с новым значением с присвоением старого адреса» Зачем ее создавать, эту новую структуру, к тому же назначать старый адрес?
Inkveeвлепить жирный лайк
freeba
ответов1 / помог1
Code, Debug, Love the Emperor! 1680287611
int это ValueType - он не хранится в куче. Соответственно в структуре выделено под него четыре байта - которые и меняются при присваивании нового значения.
Inkveeвлепить жирный лайк
Inkvee
ответов0 / помог0
1680287736
IamRain,« Зачем ее создавать, эту новую структуру, к тому же назначать старый адрес?» Ну, если бы у меня было дополнительно поле строки "Вася". Я бы захотел изменить значение на "кВася", то старая строка бы удалилась, и на ее месте создалась бы новая, с новым значением по старому адресу. Мой вопрос будет ли такое же поведение у структуры, которая является значимым типом?
влепить жирный лайк
IamRain
ответов2 / помог2
Любую достаточно развитую технологию не отличить от магии (С) Артур Ч. Кларк 1680287925
Inkvee, «Мой вопрос будет ли такое же поведение у структуры, которая является значимым типом?» Поле значимого типа (int), объявленное в структуре, занимает часть памяти этой структуры, и при перезаписи этого значения вы просто меняете значение в памяти. Другое дело со строками. Строки - иммутабельный тип, это значит, что любая операция на изменение содержимого этой строки не изменяет эту строку, но создает новую строку. После изменения переменной строкового типа в структуре, поле будет возвращать уже ссылку на новую строку. «с новым значением по старому адресу.» Нет, строки иммутабельны, это значит, что не будет старого адреса, будет новая строка, с новым адресом. То, что вы называете старым адресом - это просто поле, хранящее ссылку. Эта ссылка изменится. «Итерировать много данных у много объектов.» Структуры имеет смысл использовать в коллекциях в тех случаях, когда важно задействовать L1-L3 кэши процессора, в таком случае говорят "обеспечить высокую плотность размещения объектов в памяти". Правда, надо быть уверенным, что непрерывного свободного пространства под коллекцию структур хватает. В случае массива ссылок - да, эти ссылки тоже кэшируются, но фактическое то размещение данных в памяти неизвестно, скорее всего неплотное. То есть тут все еще нужно прыгнуть на ту область в памяти, куда указывает ссылка. То есть использование кэша тут не дает никакого преимущества.
Inkveeвлепить жирный лайк
colorotur
ответов2 / помог1
1680288133
Inkvee, «если я изменю значение этого поля будет ли создана новая структура с новым значением с присвоением старого адреса или просто значение по адресу изменится?» Переменная — это участок памяти, в которой можно хранить значения в соответсвии с типом этой переменной. Структура (значимый тип) отличается от класса (ссылочного типа) тем, что хранится в переменной этого типа. В переменных значимых типов хранится экземпляр, в переменных ссылочных типов — ссылка на экземпляр. Поскольку int — значимый тип, постольку значением переменной является экземпляр, а не ссылка, значит и присвоений адресов не будет. freeba, «int это ValueType - он не хранится в куче.» А где хранится int, являющийся элементом массива? Являющийся полем класса? Объявленный в блоке итератора? Объявленный в асинхронном методе? Захваченный анонимным методом? И т.д.
Inkveeвлепить жирный лайк
Сначала вход
A B i U S JS PHP HTML CSS SQL C C++ C# PYTHON JAVA
Для входа только имэйл или имя и апроль
Можно сменить аватар
Имэйл Ваше имя
Пароль