Мазмунга өтүү

Эстутумду кол менен башкаруу

Сабактын башталышы

Эстутумду кол менен башкаруу

Бөлүштүрүүнү өз колуна алуу: арена, пул, placement new жана тегиздөө

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

1. Универсалдуу үймө эмне үчүн зыян

::operator new же malloc ар бир чакырыгы күтүлбөгөндөй көп иш кылышы мүмкүн: бош тизмеден же өлчөм класстарынын себеттеринен блок издөө, блокторду бөлүү же бириктирүү, кызматтык баштарды жаңыртуу жана - атаандаштыкта - кулпу алуу. Кайтарылган блок ар бир бөлүштүрүүгө жашыруун кошумча жүк алып жүрөт (өлчөм/баш сөз, өлчөм классына тегеректөө) жана коңшуларынын жанында эмес, бөлүштүргүч орун тапкан жерде жайгашат. Өнүккөн код үчүн үч баа маанилүү:

  • Кечигүү: бир бөлүштүрүү жүздөгөн наносекунд болушу мүмкүн; ысык циклде бул үстөмдүк кылат.
  • Фрагментация: көп ар түрдүү өлчөмдөгү бөлүштүрүү жана бошотуудан кийин бош эстутум кайра колдонууга өтө майда бөлүктөргө бөлүнөт. Тышкы фрагментация блокторрдун ортосундагы орунду, ички фрагментация тегеректелген блоктун ичиндеги толтурууну текке кетирет.
  • Кэш-локалдуулук: чогуу колдонулган, бирок бири-биринен алыс бөлүштүрүлгөн объекттер кэш өткөрүп жибербей калууну жаратат. Колдонуучунун бөлүштүргүчү аларды катар жайгаштыра алат.

Чечим "тезирээк malloc жазуу" эмес. Ал жалпы багыттагы бөлүштүргүч биле албаган үлгүнү пайдалануу: "бул объекттердин баары бир убакта өлөт" (арена) же "ар бир объект так бир өлчөмдө" (пул). Үлгү аткарылганда, бөлүштүргүч көрсөткүчтү жылдырууга же тизмеден элемент алууга кыскарат - бир нече инструкция, издөөсүз, кулпусуз.

Бул сабакты YourAIZone платформасында улантыңыз

Толук сабакта — толук түшүндүрмө, чыгарылган мисалдар, көп кездешкен каталар, заматта текшерилүүчү тесттер жана ЖИ-репетитор. Конок катары дароо баштаңыз же прогрессти сактоо үчүн аккаунт түзүңүз.

Толук сабакта

  • Толук түшүндүрмө
  • Чыгарылган мисалдар
  • Көп кездешкен каталар жана алардан кантип качуу керек
  • Тест суроолору: 15
  • Тема боюнча суроолорго жооп берген ЖИ-репетитор
  • Окуучу, ата-эне жана мугалим үчүн прогрессти көзөмөлдөө