Добрый день, заказчик требует минимизировать размер исполняемого модуля, однако в проекте обширно используются виртуальные функции, во многих классах (и как следствие виртуальные деструкторы). При их использовании необходимо чтобы был включен Runtime type info и создавалась таблица type_info::vftable. Однако при отказе от CRT таблица не создается.
Вопрос: существуют ли реализации небольших CRT типа libctiny, wcrt и тп с поддержкой виртуальных функций? Какие способы решения проблемы вы видите?
Здравствуйте, Аноним, Вы писали: А>Runtime type info и создавалась таблица type_info::vftable. Однако при отказе от CRT таблица не создается.
к виртуальным функциям это никакого отношения не имеет, они и без этого работать будут. Лучше поиследовать зачем в проекет понадобилось Runtime type info, и если есть возможность рефакторить — отказаться от них.
Здравствуйте, Nik_1, Вы писали:
N_>Здравствуйте, Аноним, Вы писали: А>>Runtime type info и создавалась таблица type_info::vftable. Однако при отказе от CRT таблица не создается. N_>к виртуальным функциям это никакого отношения не имеет, они и без этого работать будут. Лучше поиследовать зачем в проекет понадобилось Runtime type info, и если есть возможность рефакторить — отказаться от них.
Отвечаю не на твой вопрос, а на то, что ты хотел услышать (но не мог об этом
сказать):
Наличие или отсутствие виртуальных функций никак не связано с наличием
или отсутствием RTTI и никак не связано с использованием или неиспользованием
CRT. Все они могут по отдельности применяться или нет, за исключением
одного маленького правила: RTTI требует в классе иметь хоть одну виртуальную
функцию.
> Вопрос: существуют ли реализации небольших CRT типа libctiny, wcrt и тп > с поддержкой виртуальных функций? Какие способы решения проблемы вы видите?
Здравствуйте, Сергей Мухин, Вы писали:
СМ>Здравствуйте, Nik_1, Вы писали:
N_>>Здравствуйте, Аноним, Вы писали: А>>>Runtime type info и создавалась таблица type_info::vftable. Однако при отказе от CRT таблица не создается. N_>>к виртуальным функциям это никакого отношения не имеет, они и без этого работать будут. Лучше поиследовать зачем в проекет понадобилось Runtime type info, и если есть возможность рефакторить — отказаться от них.
СМ>для MS это опция /GR- вроде
пробовал, компилятор vc 2008 express пишет:
cl : Command line warning D9025 : overriding '/GR-' with '/GR'
PModule.obj : error LNK2001: unresolved external symbol "const type_info::`vftable'" (??_7type_info@@6B@)
Гдето читал что при использовании виртуальных функций необходимо инициализировать структуру type_info, чем как раз и занимается rtti.
ps а vftable разве не расшифровывается как virtual functions table?)
Здравствуйте, MasterZiv, Вы писали:
MZ>Аноним 230 wrote:
MZ>Отвечаю не на твой вопрос, а на то, что ты хотел услышать (но не мог об этом MZ>сказать): MZ>Наличие или отсутствие виртуальных функций никак не связано с наличием MZ>или отсутствием RTTI и никак не связано с использованием или неиспользованием MZ>CRT. Все они могут по отдельности применяться или нет, за исключением MZ>одного маленького правила: RTTI требует в классе иметь хоть одну виртуальную MZ>функцию.
>> Вопрос: существуют ли реализации небольших CRT типа libctiny, wcrt и тп >> с поддержкой виртуальных функций? Какие способы решения проблемы вы видите?
MZ>Для виртуальных функций CRT не нужно.
Хмм.. а почему тогда возникает unresolved external?
Здравствуйте, MasterZiv, Вы писали:
MZ>Аноним 230 wrote:
MZ>Отвечаю не на твой вопрос, а на то, что ты хотел услышать (но не мог об этом MZ>сказать): MZ>Наличие или отсутствие виртуальных функций никак не связано с наличием MZ>или отсутствием RTTI и никак не связано с использованием или неиспользованием MZ>CRT. Все они могут по отдельности применяться или нет, за исключением MZ>одного маленького правила: RTTI требует в классе иметь хоть одну виртуальную MZ>функцию.
С маленьким добавлением — если RTTI все же нужен, то либо придется использовать CRT, либо искать иную реализацию type_info. В общем, виртуальность — отдельно, RTTI — отдельно, но с учетом сказанного тобой.
Здравствуйте, Аноним, Вы писали:
А>Вопрос: существуют ли реализации небольших CRT типа libctiny, wcrt и тп с поддержкой виртуальных функций? Какие способы решения проблемы вы видите?
увы, но виртуальные функции автоматом подгружают crt, также как и исключения, также crt подключают стандартная реализация операторов new/delete, а также инклуды некторых хедеров, например <cassert> -- тоже подключает crt, если хотите избавиться от crt, то вам придётся весь динамический полиморфизм заменить статическим(тоесть переписать на шаблоны и макросы), ну и stl тоже использовать при этом нельзя
вот тут я когда-то писал об этом подробнее http://forum.antichat.ru/showthread.php?p=448313, в коде там есть реализация почти стандартного вектора не использующая crt.
Действительно, убрал все что связано с вирт функциями, но unresolved external остался. Использую также SEH (__try/__except) но для него вроде не нужно RTTI. А для чего нужен type_info::vftable?
Здравствуйте, fkRTTI, Вы писали:
RTT>Действительно, убрал все что связано с вирт функциями, но unresolved external остался. Использую также SEH (__try/__except) но для него вроде не нужно RTTI. А для чего нужен type_info::vftable?
Как не трудно догадаться — для использования объектов класса type_info Ищите в коде typeid, либо напрямую type_info.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, fkRTTI, Вы писали:
RTT>Действительно, убрал все что связано с вирт функциями, но unresolved external остался. Использую также SEH (__try/__except) но для него вроде не нужно RTTI. А для чего нужен type_info::vftable?
Здравствуйте, fkRTTI, Вы писали:
RTT>Действительно, убрал все что связано с вирт функциями, но unresolved external остался. Использую также SEH (__try/__except) но для него вроде не нужно RTTI. А для чего нужен type_info::vftable?
Для RTTI
Попробуй так
To set this compiler option in the Visual Studio development environment
Open the project's Property Pages dialog box. For details, see How to: Open Project Property Pages.
Click the C/C++ folder.
Click the Language property page.
Modify the Enable Run-Time Type Info property.
Поставь NO
После того, как я это сделал, сообщение по type_info::vftable исчезло
Здравствуйте, fkRTTI, Вы писали: RTT>Действительно, убрал все что связано с вирт функциями, но unresolved external остался. Использую также SEH (__try/__except) но для него вроде не нужно RTTI. А для чего нужен type_info::vftable?
Оно требуется для dynamic_cast<>.
Также возможно, в коде гденить напрямую юзайтся type_info.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Modify the Enable Run-Time Type Info property. PD>Поставь NO PD>После того, как я это сделал, сообщение по type_info::vftable исчезло
Там стоит NO! И вылазит сообщение с ошибкой:
cl : Command line warning D9025 : overriding '/GR-' with '/GR'
PModule.obj : error LNK2001: unresolved external symbol "const type_info::`vftable'" (??_7type_info@@6B@)
Здравствуйте, fkRTTI, Вы писали:
RTT>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>Modify the Enable Run-Time Type Info property. PD>>Поставь NO PD>>После того, как я это сделал, сообщение по type_info::vftable исчезло
RTT>Там стоит NO! И вылазит сообщение с ошибкой:
RTT>cl : Command line warning D9025 : overriding '/GR-' with '/GR' RTT>PModule.obj : error LNK2001: unresolved external symbol "const type_info::`vftable'" (??_7type_info@@6B@)
А у меня нет такого сообщения.
An option can be specified either in code or in the project's project settings. If you look at the compiler's Command Line Property Pages and if you see the conflicting options in the All Options field then the options are set in the project's property pages, otherwise, the options are set in source code.
Делай так
1. Создаем пустой проект.
2. Добавляем в него файл 1.cpp.
3. В него добавляем код
class A {
virtual void f() {}
};
int main()
{
A a;
}
4.Отменяем все дефолтные библиотеки
5. Ставим Enable Run-Time Type Info property NO
6. Компилируем. Естественно, будкт unresolved _mainCRTStartup и др, но const type_info::`vftable' там не будет. И warning D9025 тоже не будет.
7. Ищем отличия.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, fkRTTI, Вы писали:
RTT>>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>>Modify the Enable Run-Time Type Info property. PD>>>Поставь NO PD>>>После того, как я это сделал, сообщение по type_info::vftable исчезло
RTT>>Там стоит NO! И вылазит сообщение с ошибкой:
RTT>>cl : Command line warning D9025 : overriding '/GR-' with '/GR' RTT>>PModule.obj : error LNK2001: unresolved external symbol "const type_info::`vftable'" (??_7type_info@@6B@)
PD>А у меня нет такого сообщения.
PD>An option can be specified either in code or in the project's project settings. If you look at the compiler's Command Line Property Pages and if you see the conflicting options in the All Options field then the options are set in the project's property pages, otherwise, the options are set in source code.
PD>Делай так
PD>1. Создаем пустой проект. PD>2. Добавляем в него файл 1.cpp. PD>3. В него добавляем код
PD>class A { PD> virtual void f() {} PD>};
PD>int main() PD>{ PD> A a; PD>}
PD>4.Отменяем все дефолтные библиотеки PD>5. Ставим Enable Run-Time Type Info property NO
PD>6. Компилируем. Естественно, будкт unresolved _mainCRTStartup и др, но const type_info::`vftable' там не будет. И warning D9025 тоже не будет. PD>7. Ищем отличия.
Тоже сделал это, только перенес полностью свой проект туда, unresolved vftable исчезло. Зато появилось вот что:
ParsingModule.obj : error LNK2001: unresolved external symbol __except_handler3
FileFunctionsModule.obj : error LNK2001: unresolved external symbol __except_handler3
LoadRulesModule.obj : error LNK2001: unresolved external symbol __except_handler3
NetworkModule.obj : error LNK2001: unresolved external symbol __except_handler3
FileFunctionsModule.obj : error LNK2001: unresolved external symbol __local_unwind2
Я конечно понимал что отказ от CRT ведет за собой долгие танцы с бубном, но не на столько же)
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, fkRTTI, Вы писали: RTT>>Тоже сделал это, только перенес полностью свой проект туда, unresolved vftable исчезло. Зато появилось вот что: PD>__try — __except. PD>http://wasm.ru/print.php?article=Win32SEHPietrek2 RTT>>Я конечно понимал что отказ от CRT ведет за собой долгие танцы с бубном, но не на столько же) PD>И не уверен, что это все.
Здравствуйте, fkRTTI, Вы писали:
RTT>Там стоит NO! И вылазит сообщение с ошибкой:
RTT>cl : Command line warning D9025 : overriding '/GR-' with '/GR' RTT>PModule.obj : error LNK2001: unresolved external symbol "const type_info::`vftable'" (??_7type_info@@6B@)
Проверь эту опцию для файла PModule.cpp — ее можно выставлять отдельно для каждого файла. Возможно, именно для этого файла она включена.
Здравствуйте, <Аноним>, Вы писали:
А>Добрый день, заказчик требует минимизировать размер исполняемого модуля, однако в проекте обширно используются виртуальные функции, во многих классах (и как следствие виртуальные деструкторы). При их использовании необходимо чтобы был включен Runtime type info и создавалась таблица type_info::vftable. Однако при отказе от CRT таблица не создается.
type_info не нужно для работы виртуальных функций. Однако, оно нужно не только для RTTI (dynamic_cast и typeid), но и для поддержки C++ исключений. Проверь ключи /EH
А>Вопрос: существуют ли реализации небольших CRT типа libctiny, wcrt и тп с поддержкой виртуальных функций?
Такой С++ runtime есть здесь, но он нужен для других случаев — поддержки С++ исключений, RTII, конструирования стических объектов (включая std::cout & Co).
А> Какие способы решения проблемы вы видите?
Необходимо добавить определение, которое должно соотвествовать внутреннему типу MSVC _TypeDescriptor
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, Sni4ok, Вы писали:
S>увы, но виртуальные функции автоматом подгружают crt
Как, где и зачем они это делают?
Какие именно функции из CRT нужны виртуальным функциям и для чего?
У MSVC есть такая мулька, что у деструктора есть скрытый аргумент, который говорит, надо ли вызвать opertaor delete( this ) в конце деструктора. Соответственно сгенерированный компилятором виртуальный деструктор будет звать operator delete.
Но это, IMHO, можно довольно легко обойти, например заведя метод operator delete во всех корнях иерархий с виртуальными функциями. А уж в тексте этого operator delete как-нибудь обойтись без вызовов CRT.
Какие ещё есть зависимости?
Может эти функции можно просто реализовать самому? Исходники CRT ведь доступны?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском