@Laax

Что за типы функций при импорте OpenCV DLL в Delphi?

При импорте вручную из С++ динамической библиотеки с классами (не спрашивайте зачем мне это нужно), некоторые функции имеют пометку `vbase destructor', например,
void cv::BRISK::`vbase destructor'(void)
Очевидно, что это деструктор, но описан как функция. Предполагаю, что виртуальный и вызывается автоматически.
Но что на самом деле означает `vbase destructor', в каких случаях он вызывается и чем отличается от обычных деструкторов?

Аналогично, есть `default constructor closure', например,
void cv::detail::BlocksChannelsCompensator::`default constructor closure'(void)

Очевидно, что это конструктор, но описан как функция. Предполагаю, что вызывается автоматически в замыканиях.
Но что на самом деле означает `default constructor closure', в каких случаях он вызывается и чем отличается от обычных конструкторов?
Дополнение:
Это OpenCV версии 4.6.0. Взяты готовые dll с сайта opencv.org. Чем они собирали? Сложно сказать какой версии CMake и MS Visual Studio. Последний скорее всего не ниже 2019.
Платформа Windows x64.
Импорт в среде Delphi 11.
Репозитарий Delphi-OpenCV-Class
Статья Delphi+OpenCV
  • Вопрос задан
  • 174 просмотра
Решения вопроса 1
TrueBers
@TrueBers
Гуглю за еду
не спрашивайте зачем мне это нужно
действительно. C++ ABI -- это боль, сильная боль. Даже разработчики компиляторов страдают от неё. Если вам уж прям так важно поковыряться в его кишках, то изучайте исходники LLVM и спецификацию стандарта ABI. А если нет, то возьмите OpenCV C API и не выносите себе голову.

но описан как функция
А как он должен быть описан, как сферический код в вакууме?

чем отличается от обычных деструкторов
Стандарт определяет деструкторы:
  1. base object destructor
  2. complete object destructor
  3. deleting destructor
  4. trivial/non-trivial destructor

Что из этого есть "обычный" деструктор?

Здесь про деструкторы и псевдо-код порядка их вызовов. Здесь -- про общее устройство виртуальной таблицы.

что на самом деле означает `vbase destructor`, в каких случаях он вызывается
Есть предположение, что это имя экспортируемого complete object destructor для класса, базовым классом которого является класс с виртуальным деструктором. То есть, он выполняет часть процесса цепочки деструкторов, которая помимо вызова base object destructor, вызывает также все деструкторы для всех базовых виртуальных классов. Но при этом ещё не вызван deleting destructor, который собственно вызывает operator delete. Т.е. получается, что complete object destructorпо включённому в него списку действий, как бы "наследуется" от base object destructor. В свою очередь, deleting destructor "наследуется" от complete object destructor.

Предполагаю, что вызывается автоматически в замыканиях. Но что на самом деле означает `default constructor closure'
Для чего он может вызываться в замыканиях, просто чтоб было?

Моё же предположение, что это замыкание -- некий адаптер-костыль чтоб привести нетривиальные параметры конструктора в удобоваримую ABI-форму, и вызывается когда default constructor имеет default non-trivial parameters, для которых надо сначала вызвать конструктор, либо когда это variadic конструктор, которому нужно привести список аргументов к Сишному `va_arg`, чтобы переслать их через границу ABI. Вот в этом случае он вызывается, как я понимаю.

Один ценный никому не нужный совет: тебе НЕ НУЖНО в этом разбираться. Брось эту затею и возьми сишный API.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы