Виртуальные функции без CRT
От: Аноним  
Дата: 09.11.09 12:11
Оценка:
Добрый день, заказчик требует минимизировать размер исполняемого модуля, однако в проекте обширно используются виртуальные функции, во многих классах (и как следствие виртуальные деструкторы). При их использовании необходимо чтобы был включен Runtime type info и создавалась таблица type_info::vftable. Однако при отказе от CRT таблица не создается.

Вопрос: существуют ли реализации небольших CRT типа libctiny, wcrt и тп с поддержкой виртуальных функций? Какие способы решения проблемы вы видите?

Заранее благодарю за ответы.
Re: Виртуальные функции без CRT
От: Nik_1 Россия  
Дата: 09.11.09 12:15
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:
А>Runtime type info и создавалась таблица type_info::vftable. Однако при отказе от CRT таблица не создается.
к виртуальным функциям это никакого отношения не имеет, они и без этого работать будут. Лучше поиследовать зачем в проекет понадобилось Runtime type info, и если есть возможность рефакторить — отказаться от них.
Re[2]: Виртуальные функции без CRT
От: Сергей Мухин Россия  
Дата: 09.11.09 12:30
Оценка:
Здравствуйте, Nik_1, Вы писали:

N_>Здравствуйте, Аноним, Вы писали:

А>>Runtime type info и создавалась таблица type_info::vftable. Однако при отказе от CRT таблица не создается.
N_>к виртуальным функциям это никакого отношения не имеет, они и без этого работать будут. Лучше поиследовать зачем в проекет понадобилось Runtime type info, и если есть возможность рефакторить — отказаться от них.

для MS это опция /GR- вроде
---
С уважением,
Сергей Мухин
Re: Виртуальные функции без CRT
От: MasterZiv СССР  
Дата: 09.11.09 12:43
Оценка: 1 (1) +2
Аноним 230 wrote:

Отвечаю не на твой вопрос, а на то, что ты хотел услышать (но не мог об этом
сказать):
Наличие или отсутствие виртуальных функций никак не связано с наличием
или отсутствием RTTI и никак не связано с использованием или неиспользованием
CRT. Все они могут по отдельности применяться или нет, за исключением
одного маленького правила: RTTI требует в классе иметь хоть одну виртуальную
функцию.

> Вопрос: существуют ли реализации небольших CRT типа libctiny, wcrt и тп

> с поддержкой виртуальных функций? Какие способы решения проблемы вы видите?

Для виртуальных функций CRT не нужно.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Виртуальные функции без CRT
От: fkRTTI  
Дата: 09.11.09 12:46
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>Здравствуйте, 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?)
Re[2]: Виртуальные функции без CRT
От: fkRTTI  
Дата: 09.11.09 12:50
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Аноним 230 wrote:


MZ>Отвечаю не на твой вопрос, а на то, что ты хотел услышать (но не мог об этом

MZ>сказать):
MZ>Наличие или отсутствие виртуальных функций никак не связано с наличием
MZ>или отсутствием RTTI и никак не связано с использованием или неиспользованием
MZ>CRT. Все они могут по отдельности применяться или нет, за исключением
MZ>одного маленького правила: RTTI требует в классе иметь хоть одну виртуальную
MZ>функцию.

>> Вопрос: существуют ли реализации небольших CRT типа libctiny, wcrt и тп

>> с поддержкой виртуальных функций? Какие способы решения проблемы вы видите?

MZ>Для виртуальных функций CRT не нужно.


Хмм.. а почему тогда возникает unresolved external?
Re[2]: Виртуальные функции без CRT
От: Pavel Dvorkin Россия  
Дата: 09.11.09 12:50
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Аноним 230 wrote:


MZ>Отвечаю не на твой вопрос, а на то, что ты хотел услышать (но не мог об этом

MZ>сказать):
MZ>Наличие или отсутствие виртуальных функций никак не связано с наличием
MZ>или отсутствием RTTI и никак не связано с использованием или неиспользованием
MZ>CRT. Все они могут по отдельности применяться или нет, за исключением
MZ>одного маленького правила: RTTI требует в классе иметь хоть одну виртуальную
MZ>функцию.

С маленьким добавлением — если RTTI все же нужен, то либо придется использовать CRT, либо искать иную реализацию type_info. В общем, виртуальность — отдельно, RTTI — отдельно, но с учетом сказанного тобой.
With best regards
Pavel Dvorkin
Re[4]: Виртуальные функции без CRT
От: fkRTTI  
Дата: 09.11.09 12:59
Оценка:
Действительно, убрал все что связано с вирт функциями, а unresolved external остался..
Re: Виртуальные функции без CRT
От: Sni4ok  
Дата: 09.11.09 13:02
Оценка: 4 (1) -2
Здравствуйте, Аноним, Вы писали:

А>Вопрос: существуют ли реализации небольших CRT типа libctiny, wcrt и тп с поддержкой виртуальных функций? Какие способы решения проблемы вы видите?


увы, но виртуальные функции автоматом подгружают crt, также как и исключения, также crt подключают стандартная реализация операторов new/delete, а также инклуды некторых хедеров, например <cassert> -- тоже подключает crt, если хотите избавиться от crt, то вам придётся весь динамический полиморфизм заменить статическим(тоесть переписать на шаблоны и макросы), ну и stl тоже использовать при этом нельзя
вот тут я когда-то писал об этом подробнее http://forum.antichat.ru/showthread.php?p=448313, в коде там есть реализация почти стандартного вектора не использующая crt.
Re[3]: Виртуальные функции без CRT
От: fkRTTI  
Дата: 09.11.09 13:03
Оценка:
Действительно, убрал все что связано с вирт функциями, но unresolved external остался. Использую также SEH (__try/__except) но для него вроде не нужно RTTI. А для чего нужен type_info::vftable?
Re[4]: Виртуальные функции без CRT
От: Тот кто сидит в пруду Россия  
Дата: 09.11.09 13:08
Оценка:
Здравствуйте, fkRTTI, Вы писали:

RTT>Действительно, убрал все что связано с вирт функциями, но unresolved external остался. Использую также SEH (__try/__except) но для него вроде не нужно RTTI. А для чего нужен type_info::vftable?


Как не трудно догадаться — для использования объектов класса type_info Ищите в коде typeid, либо напрямую type_info.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[4]: Виртуальные функции без CRT
От: Сергей Мухин Россия  
Дата: 09.11.09 13:10
Оценка:
Здравствуйте, fkRTTI, Вы писали:

RTT>Действительно, убрал все что связано с вирт функциями, но unresolved external остался. Использую также SEH (__try/__except) но для него вроде не нужно RTTI. А для чего нужен type_info::vftable?


typeid
---
С уважением,
Сергей Мухин
Re[3]: Виртуальные функции без CRT
От: MShura  
Дата: 09.11.09 13:11
Оценка:
MZ>>Для виртуальных функций CRT не нужно.

RTT>Хмм.. а почему тогда возникает unresolved external?


Уберите вызовы dynamic_cast
Re[4]: Виртуальные функции без CRT
От: Pavel Dvorkin Россия  
Дата: 09.11.09 13:13
Оценка:
Здравствуйте, 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 исчезло
With best regards
Pavel Dvorkin
Re[4]: Виртуальные функции без CRT
От: Nik_1 Россия  
Дата: 09.11.09 13:21
Оценка:
Здравствуйте, fkRTTI, Вы писали:
RTT>Действительно, убрал все что связано с вирт функциями, но unresolved external остался. Использую также SEH (__try/__except) но для него вроде не нужно RTTI. А для чего нужен type_info::vftable?

Оно требуется для dynamic_cast<>.
Также возможно, в коде гденить напрямую юзайтся type_info.
Re[5]: Виртуальные функции без CRT
От: fkRTTI  
Дата: 09.11.09 13:22
Оценка:
Здравствуйте, 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@)


А в коде нет ни typeid ни type_info!
Re[5]: Виртуальные функции без CRT
От: fkRTTI  
Дата: 09.11.09 13:26
Оценка:
dynamic_cast тоже нет, походу компилятор игнорирует /GR-
Re[6]: Виртуальные функции без CRT
От: Pavel Dvorkin Россия  
Дата: 09.11.09 13:39
Оценка:
Здравствуйте, 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. Ищем отличия.
With best regards
Pavel Dvorkin
Re[7]: Виртуальные функции без CRT
От: fkRTTI  
Дата: 09.11.09 13:50
Оценка:
Здравствуйте, 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 ведет за собой долгие танцы с бубном, но не на столько же)
Re[8]: Виртуальные функции без CRT
От: Pavel Dvorkin Россия  
Дата: 09.11.09 13:58
Оценка:
Здравствуйте, fkRTTI, Вы писали:

RTT>Тоже сделал это, только перенес полностью свой проект туда, unresolved vftable исчезло. Зато появилось вот что:


__try — __except.

http://wasm.ru/print.php?article=Win32SEHPietrek2

RTT>Я конечно понимал что отказ от CRT ведет за собой долгие танцы с бубном, но не на столько же)


И не уверен, что это все.
With best regards
Pavel Dvorkin
Re[9]: Виртуальные функции без CRT
От: fkRTTI  
Дата: 09.11.09 14:17
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, fkRTTI, Вы писали:

RTT>>Тоже сделал это, только перенес полностью свой проект туда, unresolved vftable исчезло. Зато появилось вот что:
PD>__try — __except.
PD>http://wasm.ru/print.php?article=Win32SEHPietrek2
RTT>>Я конечно понимал что отказ от CRT ведет за собой долгие танцы с бубном, но не на столько же)
PD>И не уверен, что это все.

убрал __try-__except 0 errors/0 warings, спасиб всем.
Re[6]: Виртуальные функции без CRT
От: Bell Россия  
Дата: 10.11.09 02:48
Оценка:
Здравствуйте, 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 — ее можно выставлять отдельно для каждого файла. Возможно, именно для этого файла она включена.
Любите книгу — источник знаний (с) М.Горький
Re: Виртуальные функции без CRT
От: gear nuke  
Дата: 10.11.09 17:36
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Добрый день, заказчик требует минимизировать размер исполняемого модуля, однако в проекте обширно используются виртуальные функции, во многих классах (и как следствие виртуальные деструкторы). При их использовании необходимо чтобы был включен 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
class type_info
{
  public:

    virtual ~type_info();

  private:

    mutable void* data;
};

static_assert(sizeof _TypeDescriptor == sizeof type_info, "broken type");
.
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
Re[2]: Виртуальные функции без CRT
От: Erop Россия  
Дата: 11.11.09 22:44
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>увы, но виртуальные функции автоматом подгружают crt


Как, где и зачем они это делают?
Какие именно функции из CRT нужны виртуальным функциям и для чего?

У MSVC есть такая мулька, что у деструктора есть скрытый аргумент, который говорит, надо ли вызвать opertaor delete( this ) в конце деструктора. Соответственно сгенерированный компилятором виртуальный деструктор будет звать operator delete.

Но это, IMHO, можно довольно легко обойти, например заведя метод operator delete во всех корнях иерархий с виртуальными функциями. А уж в тексте этого operator delete как-нибудь обойтись без вызовов CRT.

Какие ещё есть зависимости?
Может эти функции можно просто реализовать самому? Исходники CRT ведь доступны?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.