Существует образец шаблона C++ в стиле RAII, который реализует право собственности на основе объектов, создавая класс, который не имеет члена и полагается на конструктор и деструктор класса (и тот факт, что деструктор автоматически вызывается при возврате функции). Например, стандарт std::lock_guard
реализует этот шаблон.Является ли сам объект оптимизирован, когда я использую этот шаблон в стиле RAII?
Я программирование EFM32 ARM Cortex-M микроконтроллеров и придумал этот класс, который использует подобный стиль:
#include <em_int.h>
class InterruptGuard final {
public:
explicit inline InterruptGuard() {
INT_Disable();
}
InterruptGuard(const InterruptGuard &other) = delete;
InterruptGuard(const InterruptGuard &&other) = delete;
inline ~InterruptGuard() {
INT_Enable();
}
InterruptGuard &operator=(const InterruptGuard &other) = delete;
InterruptGuard &operator=(const InterruptGuard &&other) = delete;
};
Так что, если я хочу, чтобы отключить прерывания внутри функции с несколькими заявлениями возвращения, я могут убедиться, что они будут повторно включены без меня, заботясь о том, чтобы явно включить их в каждый оператор возврата.
ПРИМЕЧАНИЕ: INT_Enable
и INT_Disable
функции implement a counter так INT_Enable
будет делать правильные вещи, и только разрешить прерывания, когда они действительно должны быть включены. Таким образом, этот класс должен быть надлежащим образом вложенным.
void func() {
InterruptGuard guard;
// ...
}
Мой вопрос:
Когда я использую этот шаблон, это компилятор собирается делать «правильные вещи» здесь и оптимизировать вне объекта (так что память не потреблено этого класса) и просто введите INT_Enable
и INT_Disable
вызовы функции, которая использует класс InterruptGuard
?
Вероятно , Единственный способ сказать наверняка - посмотреть на сгенерированный код. –
На самом деле нет памяти, занятой 'InterruptGuard', поэтому что нужно оптимизировать? –
@ πάνταῥεῖ 'Почему? sizeof (InterruptGuard) 'должен быть отличным от нуля, и вы можете взять адрес' guard'. –