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