Как применить ограничитель квалификатора к этому указателю

Как я могу применить 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 никогда не мог иметь ограничивающий квалификатор?

3

Решение

Документация GCC для __restrict__ (а также связанный вопрос) упоминает, что вы можете ограничить this:

Вы также можете указать, является ли функция-член this указатель сглаживается с помощью __restrict__ в качестве квалификатора функции-члена.

void T::fn () __restrict__
{
/* … */
}

В теле T::fn, this имеет эффективное определение T *__restrict__ const this, Обратите внимание, что интерпретация __restrict__ квалификатор функции-члена отличается от const или же volatile квалификатор в том смысле, что он применяется к указателю, а не к объекту. Это согласуется с другими компиляторами, которые реализуют ограниченные указатели.

Обратите внимание, однако, что маркировка this Указатель как таковой не мешает второй загрузке.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]