Я отлаживал код С++ в 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
.
У меня нет сильного опыта компилятора, поэтому я не знаю, действительно ли этот вывод имеет смысл. Может ли кто-то пролить свет на это?
Спасибо.