Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
2 / 2 / 1
Регистрация: 12.06.2022
Сообщений: 44

Меняются ли в переменных (локальных и полях) ссылки на объекты при уплотнение кучи?

22.07.2022, 15:35. Показов 2013. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ситуация.
Создаю любой ссылочный тип. Ну например класс:
C#
1
2
3
4
5
6
class My
{
   int x;
   int y;
   int z;
}
Создаю объект класса:

C#
1
My obj = new My();
При этом происходит следующее. В куче резервируется память под переменные класса. В стеке создаётся ссылка obj (8 байт при 64bit) которая указывает на память где мы собственно и создали объект.

Вопрос: а что будет происходить с ссылкой obj если произойдёт уплотнение кучи? По идее при этом программа должна поменять адрес в этой ссылке. Но тогда как то должно отслеживаться все эти ссылки. А если ссылок будет 100500? Я понимаю что не совсем представляю как работает этот механизм - поэтому задаю этот вопрос.

Собственно сам вопрос возник из-за указателей. Указатель тоже занимает 8 байт (при 64bit системе). По идее вообще не отличается от вышеописанного obj. И тот и тот просто указывает на область памяти. Но указатели подвержены деградации если сборщик перенесёт объект на который он указывает. И для предотвращения этого мы специально должны фиксировать объекты в памяти используя fixed.

Но для obj мы этого не используем и всё работает нормально.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.07.2022, 15:35
Ответы с готовыми решениями:

Ссылки на объекты в функции с не заданным типом переменных
Как правильно передавать ссылки на объекты в функции с не заданным типом переменных и возможно ли это? Для общего случая я это...

При добавлении строк ссылки не меняются
Здравствуйте! Пожалуйста, разъясните, что значит, что при добавлении строк сылки (cell references) не меняются. И в каких случаях...

При объединении кучи файлов в один не копируется ссылки
Добрый день. Excel 2019 и где то 500 файлов, которые надо объединить в один, файлы xlsx, содержат одинаковые столбцы. В одном из...

22
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
23.07.2022, 04:23
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от dev_usr Посмотреть сообщение
все ответы и так можно было нагуглить в течении получаса
Лучше бы так и сделали, а не отнимали у занятых людей время на ответы и бесполезные споры с вами...

Цитата Сообщение от dev_usr Посмотреть сообщение
Когда то удалился отсюда путём забития рандомного пароля, просто так акк нельзя удалить. Повторим опыт.
Прощайте, скучать по вам мы точно не будем.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16157 / 11277 / 2891
Регистрация: 21.04.2018
Сообщений: 33,158
Записей в блоге: 2
23.07.2022, 10:22
Цитата Сообщение от dev_usr Посмотреть сообщение
Если даже где то резервировалась память под обратные ссылки с выравниванием - то этот бы код показал бы не 0.
Не буду заверять, что знаю все тонкости этого вопроса, но попробуйте такой тест:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
        public static unsafe void TestReference()
        {
            // Создание списка пустых ссылок чтобы GC изменил адреса после уплотнения кучи.
            List<object>? objs = new List<object>(1_000_000);
            for (int i = 0; i < objs.Count; i++)
            {
                objs.Add(new object());
            }
 
            // Создание двух переменных со ссылками на один и тот же объект.
            object obj1 = new object();
            object obj2 = obj1;
 
            // Получение адреса памяти на этот же объект из обеих переменных.
            TypedReference tr1 = __makeref(obj1);
            IntPtr ptr1 = **(IntPtr**)(&tr1);
            TypedReference tr12 = __makeref(obj2);
            IntPtr ptr12 = **(IntPtr**)(&tr12);
 
 
            // Удаление списка и уплотнение кучи.
            objs = null;
            GC.Collect();
 
            // Получение адреса после уплотнения.
            TypedReference tr2 = __makeref(obj2);
            IntPtr ptr2 = **(IntPtr**)(&tr2);
 
            WriteLine($"Проверка равенства ссылок в переменных: {object.ReferenceEquals(obj1, obj2)}");
            WriteLine($"Проверка равенства адреса на объект до уплотнения: {object.Equals(ptr1, ptr12)}");
            WriteLine($"Проверка равенства адреса на объект после уплотнения: {object.Equals(ptr1, ptr2)}");
            WriteLine($"Адреса до и после уплотнения: {ptr1} - {ptr12} - {ptr2}");
        }
Добавлено через 35 минут
dev_usr, кстати из-за того что адреса объектов в рунтайм динамически и непредсказуемо могут измениться, при работе с объектами (особенно длительной, с большими) напрямую в памяти (в небезопасном коде) необходимо сначала зафиксировать объект в памяти: оператор fixed, метод GCHandle.Alloc( example, GCHandleType.Pinned).
0
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
23.07.2022, 17:02
dev_usr, Для перетаскивания объектов между "управляемыми" и "неуправляемыми" объектами чтобы не морочить голову себе и другим людям используйте классы Marshal и GCHandle. они специально сделаны чтоб люди не морочили голову о том где хранятся, как хранятся указатели, а просто писали код. Поэтому и к Unsafe секции нужно относится очень осторожно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.07.2022, 17:02

Меняются ссылки меню при обращении из другой папки
Создаю сайт. На локалке, denver, с помощью Dw. Сделал навигацию-меню (где много ссылок по пунктам меню) вот часть кода: &lt;nav&gt; ...

Автоматически меняются ссылки (с http:// на https://) в детальном описании при сохранении
Добрый день! Проблема в том что если вставляешь в детальное описание раздела или элемента текст содержащий ссылку в виде http://сайт.ru она...

Меняются буквы локальных дисков
Уважаемые знатоки, сколько искал решения проблемы, но так и не нашел ответа. такая проблема. После установки Windows меняются буквы...

Получать различные начала кучи при создании кучи внутри цикла
Можно ли как-то такое провернуть, чтобы на каждой итерации цикла получались различные адреса (выбираются ОС) на начало кучи (периодические...

Рассмотреть программу, написать имена глобальных переменных, локальных переменных, формальных параметров
Program P1; var s:string; procedure P(var s:string) ; var i, j : integer; aux: char; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru