Существует по сути два подхода к динамическим массивам. Одним из них является Malloc -inment prick и realloc -ing с вдвое большей емкостью по мере роста массива. В какой -то момент realloc начнет выделять новый массив и копировать содержимое старого и освободить старое. Это, безусловно, самый распространенный подход, но по мере того, как массив становится очень большим, перераспределение и копия могут ввести значительную задержку.
С другой стороны, можно инициализировать массив, оставив огромное количество виртуального адресного пространства (с виртуальным , MMAP , и т. Д. В зависимости от платформы) даже на все размеры. Затем по мере роста размера массива можно просто совершить память на лету. Это не только избегает копирования, но и любые указатели на массив также не будут недействительными. Однако я не видел, чтобы это использовалось в дикой природе ... < /p>
Итак, мой вопрос в том, почему? Почему первый подход почти всегда используется, а второй - так редко? У меня не хватает значительных недостатков второго подхода? Или я даже недооцениваю частоту использования второго подхода в дикой природе? /> [*] Особые функции в этом комментарии были приведены в качестве примера, вопрос о двух подходах (резерв + Commit vs Allocate + Copy), тот факт, что большой Malloc не будет совершать, если память не затрачена на многих системах, не имеет значения. Конечно, выбрать границу, чтобы быть целым физическим размером оперативной памяти или более для многих крошечных массивов, которые будут только получить лишь немного элементов, все еще может исчерпывать адресное пространство, но легко избежать этого, выбрав разумные границы (и используя вообще различный подход для небольших массивов, потому что, например, если они меньше, чем одна страница, память). копирование, вместо того, чтобы повторять память, но это реалистичное предположение:
https://github.com/llvm/llvm-project/bl ... /realloc.h
https://github.com/llvm/llvm-project/bl ... ist_heap.h
Подробнее здесь: https://stackoverflow.com/questions/797 ... rve-commit
Динамический массив: Double Size Realloc vs Big Reserve + Commit [закрыто] ⇐ C++
Программы на C++. Форум разработчиков
1755764461
Anonymous
Существует по сути два подхода к динамическим массивам. Одним из них является Malloc -inment prick и realloc -ing с вдвое большей емкостью по мере роста массива. В какой -то момент realloc начнет выделять новый массив и копировать содержимое старого и освободить старое. Это, безусловно, самый распространенный подход, но по мере того, как массив становится очень большим, перераспределение и копия могут ввести значительную задержку.
С другой стороны, можно инициализировать массив, оставив огромное количество виртуального адресного пространства (с виртуальным , MMAP , и т. Д. В зависимости от платформы) даже на все размеры. Затем по мере роста размера массива можно просто совершить память на лету. Это не только избегает копирования, но и любые указатели на массив также не будут недействительными. Однако я не видел, чтобы это использовалось в дикой природе ... < /p>
Итак, мой вопрос в том, почему? Почему первый подход почти всегда используется, а второй - так редко? У меня не хватает значительных недостатков второго подхода? Или я даже недооцениваю частоту использования второго подхода в дикой природе? /> [*] Особые функции в этом комментарии были приведены в качестве примера, вопрос о двух подходах (резерв + Commit vs Allocate + Copy), тот факт, что большой Malloc не будет совершать, если память не затрачена на многих системах, не имеет значения. Конечно, выбрать границу, чтобы быть целым физическим размером оперативной памяти или более для многих крошечных массивов, которые будут только получить лишь немного элементов, все еще может исчерпывать адресное пространство, но легко избежать этого, выбрав разумные границы (и используя вообще различный подход для небольших массивов, потому что, например, если они меньше, чем одна страница, память). копирование, вместо того, чтобы повторять память, но это реалистичное предположение:
https://github.com/llvm/llvm-project/blob/main/libc/src/stdlib/realloc.h
https://github.com/llvm/llvm-project/blob/main/libc/src/__support/freelist_heap.h
Подробнее здесь: [url]https://stackoverflow.com/questions/79741683/dynamic-array-double-size-realloc-vs-big-reserve-commit[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия