Подтвердить что ты не робот

Что такое синтетический указатель?

Я отлаживал код С++ в GDB, и я узнал, что некоторые вызовы используют так называемый "синтетический указатель". Гуглинг не принес значительного результата. Поиск здесь на SO, большинство вопросов с "синтетическими" в их названии относятся к некоторой Java-функции (даже если они говорят мне, что "синтетический" в этом контексте может означать "что-то, созданное искусственно компилятором" ).

Например, посмотрите на эту обратную трассировку, взятую из одной операции, выполненной в конструкторе MyClass, над одним членом класса под названием m (этот код был скомпилирован с помощью -O2):

#0  MyClass (arg=..., this=<synthetic pointer>) at somefile.h:144
144     m->lock();
gdb$ print this
$1 = (MyClass * const) <synthetic pointer>
gdb$ print *this
$2 = <optimized out>

В приведенной выше таблице стека указано, что this является указателем на объект, который был оптимизирован, но как возможно, что на него был вызван метод (т.е. его конструктор)? Моя дикая догадка заключается в том, что, даже если закрытый объект (m) активно используется в коде, некоторые оптимизации позволяют компилятору решить, что вложенный объект (this) на самом деле не нужен. Поскольку вызов метода m->lock(), который не может быть оптимизирован, должен быть выпущен где-то, компилятор создает "поддельный" (синтетический?) Объект, расположенный нигде в памяти, просто для переноса m.

У меня нет сильного опыта компилятора, поэтому я не знаю, действительно ли этот вывод имеет смысл. Может ли кто-то пролить свет на это?

Спасибо.

4b9b3361

Ответ 1

Компилятор может определить, действительно ли this разыменован (т.е. с использованием конкретных данных ЦП, а не общих правил С++). Если метод фактически не разыскивает this, нет необходимости иметь доступное фискальное представление.

[править] В комментариях упоминалось еще одно дело. Один синглтон имеет только одну копию, поэтому интеллектуальный компилятор может рассматривать своих членов как глобальные. Это означает, что адрес singleton->foo является константой &singleton + offset(foo). В результате этой оптимизации однопользовательским методам не нужно фактически разыгрывать this либо для доступа к элементам singleton, так что их можно снова оптимизировать.