Задать вопрос
@SergeySerge11

Как работает realoc? Копирует непосредственно ли она содержимое в физической памяти?

Как я предполагал и реализовывал(и как везде написано) работу функции, если в блоке дальше есть свободное место то разделить блок и вернуть новый размер, ни чего не копируя. Если не хватает места, то выделить в новый и скопировать туда.
И тут осенило,А зачем собственно копировать(для больших объектов)? Если можно просто поменять адреса физических страниц, или точнее в новый блок виртуальных адресов страниц подставить прежние физические?
То есть просто так же выделить новый блок, для виртуальных страниц, все как обычно, найти адреса, но не копировать, а просто передать или swap-ить физические адреса старых страниц на новые, содержащие эти данные(копировать лишь остатки если есть).
Итог resize 4мб на 8мб данных за 1000 свапов. распадется на задачу, найти 8мб виртуальных адресов, 2000 страниц,
и установить там новые адреса физические адреса(1000 адресов старых страниц). Ведь копирование просто бессмысленно.
2 вопроса, какие есть методы для замены физических адресов для виртуальных страниц? Или типа не доступно в режиме пользователя, хотя по идее это же работа в памяти процесса все происходит. И все проиходит с уже выделенными виртуальными страницами
И реализовано ли так хоть где-то? Не я же первый додумался.
И походу не везде, потому что 100% реализаций всех бибилотек с контейнером типа Списка есть такая структура кода, например весь c#
T[]newArray= new T[size*2];
   copy(oldArray,newArray,size);
  oldArray=newArray;

Типичный код в реализациях всех контейнерах, А Для такого кода точно не сработает такой метод, так как тут одновременное существование 2 массивов.
И это вообще все контейнеры всех типов данных в c#, к примеру, а может и вообще везде. Что тогда сложного сделать так же.
  • Вопрос задан
  • 22 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы