Как применить ограничитель квалификатора к этому указателю - PullRequest
0 голосов
/ 09 ноября 2018

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

1 Ответ

0 голосов
/ 09 ноября 2018

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

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

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

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

Обратите внимание, однако, что маркировка указателя this как таковая не предотвращает повторную загрузку.

...