Как я могу применить квалификатор GCC / Clang __restrict__
к указателю this
класса?
Этот вопрос был вдохновлен выступлением Ричарда Пауэлла на CppCon 2018, " Как спорить (мент). " Я видел похожий вопрос " ограничение использования функций-членов (ограничение этого указателя). " (Весь код можно найти в Compiler Explorer )
void bar();
class Foo {
public:
int this_example() const {
if (value > 0) {
bar();
return value;
} else {
return value;
}
}
private:
int value;
};
Приведенный выше код генерирует следующую сборку. В нем мы видим, что value
должен быть загружен дважды через указатель this
. Это имеет смысл, это является следствием того, что C ++ унаследован от C, а ограничитель restrict позволяет программисту отключить поведение. Я не могу найти способ включить функцию restrict
для указателя this
.
Foo::this_example() const: # @Foo::this_example() const
push rbx
mov eax, dword ptr [rdi]
test eax, eax
jle .LBB2_2
mov rbx, rdi
call bar()
mov eax, dword ptr [rbx]
.LBB2_2:
pop rbx
ret
На странице Compiler Explorer я показываю примеры аргументов метода, использующих __restrict__
для исключения второй загрузки. Также есть пример передачи ссылки на структуру функции и использования __restrict__
для исключения второй загрузки.
Я могу представить себе мир, в котором компилятор позволил бы программисту упоминать неявный указатель this
в аргументах метода. Затем компилятор может разрешить применение квалификаторов к указателю this
. См. Код ниже для примера.
class Foo {
public:
int unrestricted(Foo *this);
int restricted(Foo *__restrict__ this);
};
В качестве последующего вопроса, есть ли что-то в стандарте C ++ или в директиве C ++, которое могло бы сделать так, чтобы у this
никогда не было ограничителя?