Я отлаживал некоторый C++ код в 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
.
У меня нет большого опыта работы с компиляторами, поэтому я не знаю, имеет ли этот вывод смысл. Не мог бы кто-нибудь пролить свет на это?
Спасибо.
Компилятор может определить, действительно ли this
разыменовывается (т.е. используя специфические детали CPU, а не общие правила C++). Если метод на самом деле не разыменовывает this
, то нет необходимости иметь доступное физическое представление.
[edit]
В комментариях jww упомянул еще один случай. Синглтон имеет только одну копию, поэтому умный компилятор может рассматривать его члены как глобальные. Это означает, что адрес singleton->foo
- это просто константа &singleton + offset(foo)
. В результате этой оптимизации методам синглтона не нужно разыменовывать this
, чтобы получить доступ к членам синглтона, так что это снова может быть оптимизировано.