kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
Marco Leogrande
Marco Leogrande
Вопрос

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

Я отлаживал некоторый 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.

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

Спасибо.

28 2012-08-09T07:35:12+00:00 1
Программирование
c++
gdb
pointers
Решение / Ответ
 MSalters
MSalters
9-го августа 2012 в 7:38
2012-08-09T07:38:58+00:00
Дополнительно
Источник
Редактировать
#16909308

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

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

 MSalters
MSalters
Редактировал ответ 21-го августа 2015 в 7:45
13
0
Похожие сообщества 9
pro.cxx
pro.cxx
5 992 пользователей
C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. No Ads, offtop, flood 2. Полные правила тут https://t.me/ProCxx/259155 Объявления о вакансиях,эвентах - в лс @AlexFails или @MasterZiV
Открыть telegram
supapro.cxx
supapro.cxx
5 026 пользователей
Чат для тех, кто немного знает C++, простые вопросы по C++, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат-флудилка — @fludpac /прогерские вопросы – @pro_prog 🚫flood, pron, spam; ✅УВАЖАЙТЕ ДРУГ ДРУГА!
Открыть telegram
Хирьянов Т.Ф., Алгоритмы и структуры данных (С++)
Хирьянов Т.Ф., Алгоритмы и структуры данных (С++)
1 393 пользователей
Лекции: www.youtube.com/playlist?list=PLRDzFCPr95fL_5Xvnufpwj2uYZnZBBnsr Практика: cs.mipt.ru/cpp_algo Спонсировать: www.paypal.me/tkhirianov Онлайн компилятор https://godbolt.org
Открыть telegram
Чат конференции C++ Russia
Чат конференции C++ Russia
1 205 пользователей
Канал конференции: @cpprussia_channel Ближайшая конференция — C++ Russia 2023, 11–12 мая · Online Оффлайн — 23–24 мая · Москва Билеты: https://tinyurl.com/CPPRussia2023 Саппорт: @JUGConfSupport_bot
Открыть telegram
Android NDK (C++) — русскоговорящее сообщество
Android NDK (C++) — русскоговорящее сообщество
783 пользователей
Общаемся на темы, посвященным Android-разработке на C++. Обмен новостями, опытом и наработками. + Про Android: @android_ru + Про iOS: @ios_ru + Канал Android: @pandroidtoday_ru + Вакансии: @mobile_jobs Рекомендуем отключить уведомления.
Открыть telegram
C++ для самых маленьких и отчаяных
C++ для самых маленьких и отчаяных
564 пользователей
Лоу левел (по среднему IQ участников) чатик По продвижению вакансий писать @vertver Флудилка чата - @hckcxx
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 6 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией