MSVC object memory layout
От: pva  
Дата: 03.07.25 11:06
Оценка:
Привет,

столкнулся тут с проблемой небольшой.
Вкратце: MSVC при компиляции строит vtbl не в порядке расположения функций в описании объекта.
  Подробности
class A {
public:
 virtual void a();
 virtual void b();
}
Строит нормально.

class A {
protected:
 virtual void a();
public:
 virtual void b();
}
Помещает a() после b();

Можно ли заставить ее строить таблицу в требуемом порядке? Может ключ какой компиляции?
newbie
Re: MSVC object memory layout
От: Великий Мессия google
Дата: 03.07.25 11:40
Оценка: 2 (1)
- в нулевой оптимизации должны идти в том же порядке
— можно попробовать запихнуть в отдельную секцию по порядку
https://learn.microsoft.com/en-us/cpp/cpp/allocate?view=msvc-170
— можно попробовать указать линкеру порядок, ключ /ORDER
https://learn.microsoft.com/en-us/cpp/build/reference/linker-options?view=msvc-170
— можно попробовать перейти на линкер clang, вполне возможно там тоже есть некие опции как в gcc
Re: MSVC object memory layout
От: Maniacal Россия  
Дата: 03.07.25 12:12
Оценка: 2 (1) +2
Здравствуйте, pva, Вы писали:

pva>Вкратце: MSVC при компиляции строит vtbl не в порядке расположения функций в описании объекта.

pva>Можно ли заставить ее строить таблицу в требуемом порядке? Может ключ какой компиляции?

Если унаследоваться от абстрактного интерфейса, то будут, как в базовом интерфейсе, по идее.
Re: MSVC object memory layout
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 04.07.25 01:46
Оценка: 2 (1)
Здравствуйте, pva, Вы писали:

pva>Помещает a() после b();


Скопировал Ваш пример в файл, но не смог воспроизвести. Уверены, что ничего не путаете?
Re[2]: MSVC object memory layout
От: pva  
Дата: 05.07.25 14:21
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Скопировал Ваш пример в файл, но не смог воспроизвести. Уверены, что ничего не путаете?

Да, был там и мой косяк. Я его не сразу заметил и документация его не опровергала (MSDN/Google), да и чатжпт сообщал что это не стандартизировано и целиком отдано на откуп компилятору. Поэтому я и пришел на форум. Так-то потом поправил. Еще и компилятор был старый — VS2008/Win32.
newbie
Re[3]: MSVC object memory layout
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 05.07.25 15:36
Оценка: +2
Здравствуйте, pva, Вы писали:

ЕМ>>Скопировал Ваш пример в файл, но не смог воспроизвести. Уверены, что ничего не путаете?

pva>Да, был там и мой косяк. Я его не сразу заметил и документация его не опровергала (MSDN/Google), да и чатжпт сообщал что это не стандартизировано и целиком отдано на откуп компилятору.

Теоретически — да, а практически все известные компиляторы располагают виртуальные методы в VTBL в порядке их следования в исходном коде. Иначе бы никакой COM не работал бы


pva>Поэтому я и пришел на форум. Так-то потом поправил.


Так и что за косяк? Какой-нибудь банальный #ifdef, или что-то повеселее?


pva>Еще и компилятор был старый — VS2008/Win32.


А это не роялит
Маньяк Робокряк колесит по городу
Re[4]: MSVC object memory layout
От: pva  
Дата: 05.07.25 16:37
Оценка:
Здравствуйте, Marty, Вы писали:

pva>>Поэтому я и пришел на форум. Так-то потом поправил.

M>Так и что за косяк? Какой-нибудь банальный #ifdef, или что-то повеселее?
Имена методов были похожи + чередование public и protected в классе было, вот я и не сразу заметил что порядок объявления методов нарушен у меня в заголовочнике.
newbie
Re[3]: MSVC object memory layout
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 07.07.25 04:28
Оценка:
Здравствуйте, pva, Вы писали:

pva>чатжпт сообщал что это не стандартизировано и целиком отдано на откуп компилятору.


Как это может быть отдано на откуп компилятору, если это часть ABI? Что б тогда было с совместимостью модулей/библиотек?

pva>компилятор был старый — VS2008/Win32.


У меня он основной, им первым и проверял.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.