порядок перегруженных методов в vtable (на win32) - PullRequest
2 голосов
/ 14 июля 2010

порядок перегруженных методов в vtable всегда одинаков для всех компиляторов win32?

Проблема: у меня есть «интерфейсы» (чисто виртуальные классы без элементов данных).Они могут быть использованы через указатель из разных компиляторов (клиент получает указатель, вызывая стандартный метод фабрики c dll).Это отлично работает в разных компиляторах (например, клиент, написанный на borland, интерфейс dll, написанный на Visual C ++), за исключением одного метода.Этот метод перегружен тем же возвращаемым значением, но другим параметром.Есть 4 версии этого метода.Один и тот же вызов этого метода возвращает разные результаты в зависимости от компилятора, который скомпилировал клиента.Беглый взгляд на код ассемблера показал мне, что в vtable, похоже, есть другое смещение (я не очень хорош в чтении ассемблера).

Теперь я не знаю - нашел ли я причинуили Borland просто обрабатывает vtable, отличный от visual studio, и все правильно, и я должен искать в другом месте.

С наилучшими пожеланиями и спасибо за ваши ответы

Тобиас

Ответы [ 4 ]

1 голос
/ 19 января 2011

Мы столкнулись с этой проблемой несколько лет назад.Сейчас я не могу найти много подтверждающей документации, но, насколько я понимаю, Visual Studio группирует перегруженные функции в vtable, даже если они объявлены отдельно.Это заставляло нашу сборку работать нормально в gcc, но вылетало в visual studio.Я полагаю, что мы в конечном итоге просто удалили перегруженные функции, так как не нашли способ обойти это.

1 голос
/ 14 июля 2010

Есть две возможные причины: либо клиентский компилятор выбирает другую перегрузку, чем вы ожидаете, либо разные компиляторы помещают перегрузки в разные записи vtable.

Какие параметры вы передаете / ожидаете?Может ли быть проблема с разрешением перегрузки?

Если это записи vtable, вы можете попробовать переименовать перегрузки.

Пробовали ли вы использовать любой механизм COM, доступный на ваших целевых компиляторах при объявлении интерфейса -- например, используя ключевое слово interface в MSVC и указав классу интерфейса GUID.Предполагается, что COM-интерфейсы должны иметь функции в vtable в объявленном порядке, что является общим для компиляторов, если они совместно используют один и тот же заголовок.

1 голос
/ 14 июля 2010

Порядок функций в vtable является одной из вещей, охватываемых ABI .К сожалению, ABI не является частью стандарта C ++, поэтому довольно часто для разных компиляторов используются разные ABI.

0 голосов
/ 14 июля 2010

Это не должен быть неправильный индекс - они могут иметь записи абсолютно разных размеров в своих таблицах. Если их матчи ABI не гарантированы, ничто не будет таким же. Когда их ABI совпадает, это гарантировано.

Возможными ABI являются abi IA64, который используется GCC и компилятором Intel C ++, или COM-взаимодействие, представленное Microsoft.

...