@ProCxx

Страница 2348 из 2477
Igor
14.09.2018
15:25:27
Подскажите, typeid для виртуального наследования это стандартная фича?
Стандартная, но область приложения у нее маленькая.

Roman
14.09.2018
15:26:04
При этом dynamic_cast не компилируется. Почему?

При этом в ABI написано что так быть не должно: https://itanium-cxx-abi.github.io/cxx-abi/abi.html#vtable The typeinfo pointer points to the typeinfo object used for RTTI. It is always present. All entries in each of the virtual tables for a given class must point to the same typeinfo object. A correct implementation of typeinfo equality is to check pointer equality, except for pointers (directly or indirectly) to incomplete types. The typeinfo pointer is a valid pointer for polymorphic classes, i.e. those with virtual functions, and is zero for non-polymorphic classes.

Т.е. если класс не полиморфный, то указатель на RTTI должен быть равен 0

Google
Roman
14.09.2018
15:27:18
Однако это не так как видно из примера

Constantine
14.09.2018
15:27:28
Класс виртуального наследования полиморфный

Roman
14.09.2018
15:27:29
Попробовал в Clang - тоже работает

Constantine
14.09.2018
15:27:50
А вот VB неполиморфный, видимо, с него нельзя dynamic_cast

Roman
14.09.2018
15:28:06
Класс виртуального наследования полиморфный
https://stackoverflow.com/questions/20174373/c-is-a-class-with-virtual-base-but-without-virtual-functions-polymorphic-and Ответ #2

Хотя сейчас проверим

Constantine
14.09.2018
15:28:28
Нет
Цитату из стандарта? Поправим стандарт :)

Igor
14.09.2018
15:28:35
Попробовал в Clang - тоже работает
Пропустил про виртуальное наследование :) Мне кажется тогда нет, класс должен быть полиморфным.

Constantine
14.09.2018
15:29:02
Я совершенно уверен, что виртуальное наследование реализуется как виртуальный QueryInterface

Roman
14.09.2018
15:29:36
std::cout << std::is_polymorphic<D>::value << "\n"; -> 0

Constantine
14.09.2018
15:29:53
std::cout << std::is_polymorphic<D>::value << "\n"; -> 0
это не цитата из стандарта :)

Igor
14.09.2018
15:29:55
Я совершенно уверен, что виртуальное наследование реализуется как виртуальный QueryInterface
Насколько я помню, у микрософта при виртульном наследовании хранится отдельный указатель на таблицу виртуальных классов, в дополнение к таблице виртуальных функций.

Google
Roman
14.09.2018
15:30:37
Я совершенно уверен, что виртуальное наследование реализуется как виртуальный QueryInterface
Как реализуется написано в ABI по ссылке выше. Но там написано что RTTI быть не должно

В общем либо баг в документации на ABI, либо баг в компиляторах, либо я что-то не понимаю

Подумаю ещё и запощу на stackoverflow

Constantine
14.09.2018
15:32:10
Хм... окай, cppreference уверен, что требование это наличие виртуальной функции

Как хорошо, что виртуальное наследование не нужно :)

Roman
14.09.2018
15:32:28
Хотя вот на stackoverflow написано: Thus, yes the compilers I know (MSVC and those following the Itanium ABI such as gcc, icc and Clang) will use virtual tables to provide the RTTI necessary for dynamic_cast to work in the presence of virtual bases... and no this has nothing to do really with whether a class is polymorphic or not. Но dynamic_cast не компилируется!

Как хорошо, что виртуальное наследование не нужно :)
А множественное наследование нужно?

Roman
14.09.2018
15:37:52
Пример, работающий в gcc struct VB {}; struct D : virtual VB{}; int main() { D d; std::cout << typeid(d).name(); return 0; }
Блин, тут всё не правильно в коде. Странно что никто не заметил

Надо же использовать указатель на базовый класс...

Всё, вопрос отпал. Я натупил

But we need to go deeper...

struct VB {}; struct Derived0 : virtual VB{}; struct Derived1 : virtual VB{}; struct MostDerived : Derived0, Derived1 {}; int main() { MostDerived md; Derived0 *d0p = &md; uintptr_t **vtable = (uintptr_t **)d0p; type_info * tinfo = (type_info *)(*vtable)[-1]; std::cout << typeid(*d0p).name() << "\n"; std::cout << tinfo->name() << "\n"; return 0; }

Результат: 8Derived0 11MostDerived

Т.е. RTTI у него есть. Но он его не использует для typeid !

Igor
14.09.2018
15:45:32
Igor
14.09.2018
15:48:50
Привет всем. У delete много overload-ов, нужно все их оверлоадить или только один delete(void*), а остальные вызывают его?
Даже если остальные вызывают delete(void*), вам это не поможет - стандартная библиотека не может увидеть вашу перегрузку delete.

Google
Roman
14.09.2018
15:55:58
Т.е. там какой-то weak символ должен быть

Yarique
14.09.2018
16:40:30
У буста есть не потоковая сериализация, чтобы на выход был std::vector<uint8_t> или что-то вроде того?

Dark
14.09.2018
16:57:42
Всем привет, есть два нетривиальных вопроса.

Первое - что за ::template и как он работает?

Второе - как получить код после выполнения всех темплейтов? Надо посмотреть какие темплейты и с какими параметрами вызываются

Заранее спасибо

Я так понял, на мои вопросы никто ответить не может?

Или я их просто некорректо задал?

Denis
14.09.2018
17:55:57
Я так понял, на мои вопросы никто ответить не может?
https://en.cppreference.com/w/cpp/language/dependent_name листай до The template disambiguator for dependent names

Andrey
14.09.2018
17:56:40
Я так понял, на мои вопросы никто ответить не может?
Первый вопрос про ::template задан некорректно. Второй вопрос -- первая ссылка в google: https://stackoverflow.com/questions/4448094/can-we-see-the-template-instantiated-code-by-c-compiler

Dark
14.09.2018
17:58:57
По второму вопросу я не знал, как правильно на техническом инглише сформулировать просто. Тоже спасибо.

Ilia
14.09.2018
18:46:30
Т.е. если класс не полиморфный, то указатель на RTTI должен быть равен 0
Если класс не полиморфанный, то RTTI для него недоступно

Igor
14.09.2018
18:48:37
господа, а существуют ли способы ускорения clang-tidy помимо параллельного запуска?

Igor
14.09.2018
18:55:38
для clang-tidy src/**/*.cc в CI

беглым гуглом нашёл только run-clang-tidy.py из шланговских репозиториев который из-коробки не заводится (видимо какое-то несоответствие версий питона)

не то чтобы 2 минуты на 10 килострок это много, просто всегда хочется быстрее)

Igor
14.09.2018
18:56:58
А как предлагается ускорить?

Google
Igor
14.09.2018
18:57:23
Теоретически есть возможность сдампить преабулу для pch если он у вас есть и подключать ее при анализе.

Igor
14.09.2018
19:02:05
А как предлагается ускорить?
ну как миниум хочется не перегонять то, что не менялось с прошлого раза, хоть прогоняя файлы через crc32 - хотя тут возникает подвох с хедерами, которые не отражаются в списке на анализ, но приводят к кардинальным изменениям в том, во что включаются

Igor
14.09.2018
19:03:35
Неизвестно. Это твои выдумки. Или ссылку на код давай
Это он про дисамбигуацию внутри шаблонного кода с помощью template/typename.

Denis
14.09.2018
19:03:59
ну как миниум хочется не перегонять то, что не менялось с прошлого раза, хоть прогоняя файлы через crc32 - хотя тут возникает подвох с хедерами, которые не отражаются в списке на анализ, но приводят к кардинальным изменениям в том, во что включаются
мы отчасти решили эту проблему разделив проект на сабмодули. Соответственно на автобилдере прогоняется с нуля клейзи (тайди у нас нет еще, юзаем пока тольок клейзи) только для нужного модуля.

Dark
14.09.2018
19:05:05
Igor
14.09.2018
19:05:26
обожаю как Илья категорично отвергает первоначальные вопросы, а потом доходит по логу до того места, где на них проливается свет ;)

Igor
14.09.2018
19:06:43
ну как миниум хочется не перегонять то, что не менялось с прошлого раза, хоть прогоняя файлы через crc32 - хотя тут возникает подвох с хедерами, которые не отражаются в списке на анализ, но приводят к кардинальным изменениям в том, во что включаются
CLion умеет гонять clang-tidy через clangd. Если теоретически держать в clangd полную структуру проекта, то он наверное сможет переанализировать только то что нужно. Так что я думаю рано или поздно clangd допилят до такого состояния.

Denis
14.09.2018
19:07:23
сабмодули в терминах гита?
ага. Ну он изначально задумывался как набор либ, но был в монорепе. Сделали сабмодули гитовые по несколько либ (по смыслу объединены), которые собираются отдельно (подтягивая с авса собранные модули, от которых зависят). Плюс метареп собирается полностью, но это необходимое зло.

Denis
14.09.2018
19:08:40
сабмодули в терминах гита?
вот один из наших модулей, который есть в опенсорсе на автобилдере - https://travis-ci.com/opensoft/proofseed

Ilia
14.09.2018
19:08:52
typedef a<float, 0> b; b::template c<47, double>::d()
Это что то несусветное... Не знаю даже что это.

Igor
14.09.2018
19:10:00
Да? А мне казалось что new/delete можно перегрузить глобально
Был неправ. Похоже что действительно все остальные версии сваливаются в дефолтную, а она заменяется через weak symbol, по крайней мере на MSVC.

Ilia
14.09.2018
19:12:09

Страница 2348 из 2477