HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Флуд > Заметки на полях
Разработка С++ совместимой виртуальной машины
Страницы (6): « Первая ... « 2 3 4 5 [6]   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
 Дядя Миша
who said meow?

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 29941
Нанёс повреждений: 392 ед.

Рейтинг



Сделал шаблоны, ну пока только на классы. Может показаться, что шаблон на функцию ввести легче, однако это не так. Потому что перегрузка функций, блин! А шаблонные функции учитываются дедуктором тоже, что его значительно осложняет. Как вы знаете если у вас есть шаблонная функция, то вовсе необязательно при её вызове указывать foo<int>, можно просто написать foo, она должна корректно обнаружиться (даже при условии, что инстанцирование вообще не было произведено), затем, будет выполнено сравнение по кол-ву аргументов, чтобы решить, надо ли в данном случае вообще выполнять инстанцирование, или пока еще рано, затем собственно, сконструировать такую функцию и запустить её в общее пространство. С классом гораздо проще - если встретился незнакомый тип, за которым идёт скобка < то это полюбому шаблон. Возможно, необъявленный, но шаблон. Как вы знаете шаблон класса объявить неявным образом нельзя.
Хотя хрен знает, может быть в каких-то новых студиях и можно, я уже запутался в этих стандартах. Так же хочу отметить, что исходник класса для шаблона хранится и парсится целиком, без какого-либо разбора на отдельные функции. Это приводит к забавному эффекту - если внутри шаблонного класса были объявлены всяческие конструкторы и копи-конструкторы, то компилятор немедленно начинает их требовать у класса-аргумента typename. Настоящая студия, как вы помните так себя не ведёт - она не конструирует шаблонные функции класса до последнего момента или делает их во время надписи Generating code... Соответственно, если функция не была вызвана, то она даже распарсена не будет, таким образом ошибки в шаблонах могут годами лежат незамеченными, главное не вызывать явным образом функцию, содержащую ошибку. Но вот теперь я даже прямо не знаю - это баг или фича? Оставить или сделать как в настоящей студии, хотя это довольно непростая задачка и я её в любом случае напотом оставлю.
Так же более-лименее разобрался с конструкторами тривиальных типов.
Ну я выше про них писал. Оказывается что компилятор различает ГДЕ был вызван это конструктор - в теле шаблона или просто пограммист баловался. Так вот если в теле шаблона, то обычный конструктор для тривиальных типов не делает вообще ничего, а копи-конструктор инициирует либо присвоение, либо вызов копи-конструктора у самого класса-аргумента, либо вызов memcpy. У меня лично нет вызова memcpy, хотя по сравнению С++ в моём языке копировать объекты через Memcpy даже с виртуальными функциями абсолютно безопастно. Ну потому что в C++ виртуальная таблица наглухо встроена в сам объект и её адреса - локальные. А в у меня это просто хэндл на индексированную структуру RTTI, которую компилятор строит в любом случае, даже если никаких виртуальных методов у класса нет. Строит для доступа в бакэнде к любой переменной, для сериализации, ну и вообщще для манипуляции с верхнего уровня, как говорится, ведь в этом и смысл виртуальной машины - для возможности такого доступа. Поэтому у меня копирование объектов через memcpy абсолютно безопасно, но компилятор пока что сам не провоцирует подобные вызовы вместо copy constructora.
Я пока не определился как будет лучше. Учтите, что это один из самых стрёмных моментов в плюсах, когда неявно сгенерированный вызов memcpy в MSVC потом порождает порчу кучи и вообще цепочку трудно-объяснимых багов, которые лечатся созданием корректного копи-конструктора, но естественно никакого сообщения об ошибке, которое могло бы натолкнуть программиста на мысль об этом не выдаётся.

Добавлено сегодня в 13:47:

Вот какая мысль мне пришла. Перед тем как сделать вызов memcpy для копирования одного объекта в другой, компилятор может пройтись по всем членам класса, а если эти члены - сами объекты, то и внутри по их членам класса, и при обнаружении в классе хоть одного указателя - выдать предупреждение о небезопасности такого копирования. Но вы должны понимать, что если кто-то скастует указатель в int, то это обнаружить уже нипочём не удастся. Впрочем, если кто-то занимается подобными вещами, он наверное знает что делает?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

>> так а раньше почему падало ?
> Потому что говно ваш С++, вот почему

Сообщить модератору | | IP: Записан
Сообщение: 211231

Старое сообщение сегодня 10:47
-
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 17:14. Новая тема    Ответить
Страницы (6): « Первая ... « 2 3 4 5 [6]   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Флуд > Заметки на полях
Разработка С++ совместимой виртуальной машины
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2022