Эстутумду кол менен башкаруу
Бөлүштүрүүнү өз колуна алуу: арена, пул, placement new жана тегиздөө
new/delete жана malloc/free - жалпы багыттагы бөлүштүргүчтөр: алар кайсы гана өлчөмдү, кайсы гана жашоо мөөнөтүн, кайсы гана агымдан тейлөөгө милдеттүү. Ушул универсалдуулук үчүн убакыт, кэш жана фрагментация менен төлөйсүз. Колдонуучунун бөлүштүргүчү универсалдуулуктан атайын баш тартат - сиз өз программаңыздагы бөлүштүрүү үлгүсүн билесиз, ошондуктан эстутумду жалпы багыттагы бөлүштүргүчкө караганда тезирээк жана тыгызыраак кайтара аласыз. Бул тема бөлүштүрүүнү конструкциялоодон бөлүү жана экөөнү тең башкаруу жөнүндө.
- универсалдуу үймө эмне үчүн жай жана фрагментация жаратарын түшүндүрүү,
placement newменен объектти сизге тиешелүү эстутумда конструкциялоо жана аны кол менен жоготуу,- арена (bump-бөлүштүргүч) жана туруктуу өлчөмдөгү пул куруу жана кайсынысы качан ылайыктуу экенин билүү,
alignof,alignasжанаstd::alignаркылуу тегиздөө тууралуу ой жүгүртүү,- C++17
<memory_resource>аркылуу өзүнчө эстутум ресурсун STLге туташтыруу.
1. Универсалдуу үймө эмне үчүн зыян
::operator new же malloc ар бир чакырыгы күтүлбөгөндөй көп иш кылышы мүмкүн: бош тизмеден же өлчөм класстарынын себеттеринен блок издөө, блокторду бөлүү же бириктирүү, кызматтык баштарды жаңыртуу жана - атаандаштыкта - кулпу алуу. Кайтарылган блок ар бир бөлүштүрүүгө жашыруун кошумча жүк алып жүрөт (өлчөм/баш сөз, өлчөм классына тегеректөө) жана коңшуларынын жанында эмес, бөлүштүргүч орун тапкан жерде жайгашат. Өнүккөн код үчүн үч баа маанилүү:
- Кечигүү: бир бөлүштүрүү жүздөгөн наносекунд болушу мүмкүн; ысык циклде бул үстөмдүк кылат.
- Фрагментация: көп ар түрдүү өлчөмдөгү бөлүштүрүү жана бошотуудан кийин бош эстутум кайра колдонууга өтө майда бөлүктөргө бөлүнөт. Тышкы фрагментация блокторрдун ортосундагы орунду, ички фрагментация тегеректелген блоктун ичиндеги толтурууну текке кетирет.
- Кэш-локалдуулук: чогуу колдонулган, бирок бири-биринен алыс бөлүштүрүлгөн объекттер кэш өткөрүп жибербей калууну жаратат. Колдонуучунун бөлүштүргүчү аларды катар жайгаштыра алат.
Чечим "тезирээк malloc жазуу" эмес. Ал жалпы багыттагы бөлүштүргүч биле албаган үлгүнү пайдалануу: "бул объекттердин баары бир убакта өлөт" (арена) же "ар бир объект так бир өлчөмдө" (пул). Үлгү аткарылганда, бөлүштүргүч көрсөткүчтү жылдырууга же тизмеден элемент алууга кыскарат - бир нече инструкция, издөөсүз, кулпусуз.