![]() |
Страницы (13): « Первая ... « 2 3 4 5 [6] 7 8 9 10 » ... Последняя » Показать все 188 сообщений этой темы на одной странице |
HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Флуд (https://hlfx.ru/forum/forumdisplay.php?forumid=11)
-- Заметки на полях (https://hlfx.ru/forum/showthread.php?threadid=5815)
Сделал шаблоны, ну пока только на классы. Может показаться, что шаблон на функцию ввести легче, однако это не так. Потому что перегрузка функций, блин! А шаблонные функции учитываются дедуктором тоже, что его значительно осложняет. Как вы знаете если у вас есть шаблонная функция, то вовсе необязательно при её вызове указывать foo<int>, можно просто написать foo, она должна корректно обнаружиться (даже при условии, что инстанцирование вообще не было произведено), затем, будет выполнено сравнение по кол-ву аргументов, чтобы решить, надо ли в данном случае вообще выполнять инстанцирование, или пока еще рано, затем собственно, сконструировать такую функцию и запустить её в общее пространство. С классом гораздо проще - если встретился незнакомый тип, за которым идёт скобка < то это полюбому шаблон. Возможно, необъявленный, но шаблон. Как вы знаете шаблон класса объявить неявным образом нельзя.
Хотя хрен знает, может быть в каких-то новых студиях и можно, я уже запутался в этих стандартах. Так же хочу отметить, что исходник класса для шаблона хранится и парсится целиком, без какого-либо разбора на отдельные функции. Это приводит к забавному эффекту - если внутри шаблонного класса были объявлены всяческие конструкторы и копи-конструкторы, то компилятор немедленно начинает их требовать у класса-аргумента typename. Настоящая студия, как вы помните так себя не ведёт - она не конструирует шаблонные функции класса до последнего момента или делает их во время надписи Generating code... Соответственно, если функция не была вызвана, то она даже распарсена не будет, таким образом ошибки в шаблонах могут годами лежат незамеченными, главное не вызывать явным образом функцию, содержащую ошибку. Но вот теперь я даже прямо не знаю - это баг или фича? Оставить или сделать как в настоящей студии, хотя это довольно непростая задачка и я её в любом случае напотом оставлю.
Так же более-лименее разобрался с конструкторами тривиальных типов.
Ну я выше про них писал. Оказывается что компилятор различает ГДЕ был вызван это конструктор - в теле шаблона или просто пограммист баловался. Так вот если в теле шаблона, то обычный конструктор для тривиальных типов не делает вообще ничего, а копи-конструктор инициирует либо присвоение, либо вызов копи-конструктора у самого класса-аргумента, либо вызов memcpy. У меня лично нет вызова memcpy, хотя по сравнению С++ в моём языке копировать объекты через Memcpy даже с виртуальными функциями абсолютно безопастно. Ну потому что в C++ виртуальная таблица наглухо встроена в сам объект и её адреса - локальные. А в у меня это просто хэндл на индексированную структуру RTTI, которую компилятор строит в любом случае, даже если никаких виртуальных методов у класса нет. Строит для доступа в бакэнде к любой переменной, для сериализации, ну и вообщще для манипуляции с верхнего уровня, как говорится, ведь в этом и смысл виртуальной машины - для возможности такого доступа. Поэтому у меня копирование объектов через memcpy абсолютно безопасно, но компилятор пока что сам не провоцирует подобные вызовы вместо copy constructora.
Я пока не определился как будет лучше. Учтите, что это один из самых стрёмных моментов в плюсах, когда неявно сгенерированный вызов memcpy в MSVC потом порождает порчу кучи и вообще цепочку трудно-объяснимых багов, которые лечатся созданием корректного копи-конструктора, но естественно никакого сообщения об ошибке, которое могло бы натолкнуть программиста на мысль об этом не выдаётся.
Добавлено 25-09-2022 в 13:47:
Вот какая мысль мне пришла. Перед тем как сделать вызов memcpy для копирования одного объекта в другой, компилятор может пройтись по всем членам класса, а если эти члены - сами объекты, то и внутри по их членам класса, и при обнаружении в классе хоть одного указателя - выдать предупреждение о небезопасности такого копирования. Но вы должны понимать, что если кто-то скастует указатель в int, то это обнаружить уже нипочём не удастся. Впрочем, если кто-то занимается подобными вещами, он наверное знает что делает?
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Дядя Миша к слову, да, помнится по неопытности затирал классы memset, пока не выстрелил в колено пустым vtable.
Если сразу ориентироваться на людей далеких от программирования, то такая диагностика -- это только хорошо. Любят нынче строгие компиляторы, но не осуждаю.
__________________
Xash3D FWGS форк
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Начал вот тут разбираться с анализатором недостижимого кода и обратил внимание, что студии в принципе плевать на такие условия как if( 0 )
Она их не считает за мёртвый код. То есть вот такое вот:
1 | void TestDeadCode( void ) |
2 | { |
3 | return; |
4 |
5 | Msg( "dead-code\n" ); |
6 | } |
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Ну что же, пришла пора завезти в язык перегрузку операторов.
Это гораздо проще, нежели внедрение, скажем, ссылок, но есть и свои тонкости. Во первых складывается впечатление, что модель перегрузки операторов завязанная на обычные функции не совсем идеально соответствует поставленной задаче, но альтернативы в С++ всё равно нету.
Вот скажем, чтобы определить постфиксный оператор ++ или --, надо добавлять дополнительный аргумент оператору, который... не будет использоваться. А как иначе отличить префиксный оператор от постфиксного?
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
__________________
ЗЗЫ. Если вдруг кто не знал, у операторов && и || при перегрузке исчезает ленивость, что на мой взгляд делает их перегрузку полностью бессмысленной.
Добавлено 29-11-2022 в 18:53:
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
__________________
Тернарка в шаблоне для возвращения ленивости?
Добавлено 29-11-2022 в 18:59:
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
__________________
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
__________________
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Так товарищи, самый важный вопрос!
Попробуйте скомпилировать этот код:
int i = 0, j; |
j = ++i++; |
j = ++i++ + ++i++; |
c = a; a += 1; |
j = ++i++ + ++i++; |
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
А где это можно использовать?
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Временная зона GMT. Текущее время 20:11. | Страницы (13): « Первая ... « 2 3 4 5 [6] 7 8 9 10 » ... Последняя » Показать все 188 сообщений этой темы на одной странице |
На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024