Можно ли считать ленивую загрузку примером RAII?
Я догоняю свой c++ в последнее время, после пары лет эксклюзивного Objective-C на iOS, и тема, которая больше всего подходит для "нового стиля" c++, - RAII
Чтобы убедиться, что я правильно понимаю концепцию RAII, вы считаете Objective-C lazy loading property accessors типом RAII? Например, проверьте следующий метод доступа
- (NSArray *)items {
if(_items==nil) {
_items=[[NSArray alloc] initWithCapacity:10];
}
return _items
}
Можно ли считать это примером RAII? Если нет, то не могли бы вы объяснить, где я ошибаюсь?
4 ответа:
RAII , к сожалению, широко используется не по назначению.
Первоначальная концепцияприобретение ресурсов-это инициализация была связана с использованием конструкторов, чтобы гарантировать, что это произойдет. В этой идее:
std::fstream out("somefile.txt", "w");
Должен гарантировать, что если
out
когда-либо будет создан, то файл существует и готов к использованию.Следовательно, ленивая загрузка является противоположностью RAII !
Примечание: В настоящее время, однако, RAII в основном используется для обозначения автоматического очистка . Примером могут служить умные указатели. Это немного далеко от своей первоначальной цели.
Что касается очистки, другой идиомой является SBRM дляУправления связанными ресурсами . Однако он не полностью отражает идею детерминированной очистки. Идея SBRM заключается в том, что вы гарантируете, что ресурс будет очищен, когда определенный объект выходит из области видимости. Это может быть достигнуто, например, с помощью
boost::scoped_ptr
.Однако это не может захватить то, что делает
unique_ptr
, так как вы можете фактическиreturn
Aunique_ptr
таким образом, позволяя ресурсу выйти за пределы области, в которой он был создан!
В то время как аббревиатура именует инициализацию, фокус идиомы-разрушение. получение ресурсов-это инициализация больше оуправлении ресурсами с ограниченной областью , то есть когда объект управляет ресурсом и очищает его, когда он выходит за пределы области.
Нет, вовсе нет. Кроме того, под "новым стилем C++" вы подразумеваете "все здравомыслящие делали это исключительно в течение последних пятнадцати лет, по крайней мере".
RAII включает в себя объекты автоматической длительности хранения, очищающие динамические объекты в их деструкторе, которым они владеют. Точное время владения не имеет значения.
Нет; RAII-это когда некоторый объект, имеющий динамическое хранилище, оборачивается в объект(ы) с автоматическим хранением и уничтожается, когда объект(ы) с автоматическим хранением уничтожается.
Ленивая загрузка (загрузка объекта только тогда и тогда, когда вам это действительно нужно, а не раньше) и RAII на самом деле не связаны.