Как я могу применить GCC’s / Clang’s __restrict__
квалификатор к this
указатель класса?
Этот вопрос был вдохновлен выступлением Ричарда Пауэлла на CppCon 2018 «Как спорить (мент).«Я видел похожий вопрос»ограничить классификатор для функций-членов (ограничить этот указатель).«(Весь код можно найти на Проводник компилятора)
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
функциональность для 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
На Проводник компилятора странице, я показываю примеры использования аргументов метода __restrict__
убрать второй груз. Существует также пример передачи ссылки на структуру функции и использования __restrict__
убрать второй груз.
Я могу представить себе мир, в котором компилятор позволил бы программисту упомянуть неявное this
указатель в аргументах метода. Затем компилятор может разрешить применение квалификаторов к this
указатель. Смотрите код ниже для примера.
class Foo {
public:
int unrestricted(Foo *this);
int restricted(Foo *__restrict__ this);
};
В качестве последующего вопроса, есть ли что-то в стандарте C ++ или руководящих принципах C ++, которые сделали бы это так, чтобы this
никогда не мог иметь ограничивающий квалификатор?
Документация GCC для __restrict__
(а также связанный вопрос) упоминает, что вы можете ограничить this
:
Вы также можете указать, является ли функция-член
this
указатель сглаживается с помощью__restrict__
в качестве квалификатора функции-члена.void T::fn () __restrict__ { /* … */ }
В теле
T::fn
,this
имеет эффективное определениеT *__restrict__ const this
, Обратите внимание, что интерпретация__restrict__
квалификатор функции-члена отличается отconst
или жеvolatile
квалификатор в том смысле, что он применяется к указателю, а не к объекту. Это согласуется с другими компиляторами, которые реализуют ограниченные указатели.
Обратите внимание, однако, что маркировка this
Указатель как таковой не мешает второй загрузке.
Других решений пока нет …