
Igor
14.09.2018
15:25:27

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
Хотя сейчас проверим

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

Igor
14.09.2018
15:28:35

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

Igor
14.09.2018
15:29:55

Google

Roman
14.09.2018
15:30:37
В общем либо баг в документации на 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 не компилируется!

Constantine
14.09.2018
15:32:55


Roman
14.09.2018
15:37:52
Надо же использовать указатель на базовый класс...
Всё, вопрос отпал. Я натупил
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

Anatoly
14.09.2018
15:45:45

Igor
14.09.2018
15:48:50

Roman
14.09.2018
15:55:40

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

Dark
14.09.2018
17:56:34

Andrey
14.09.2018
17:56:40

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

Ilia
14.09.2018
18:46:30

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

Igor
14.09.2018
18:52:40

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 - хотя тут возникает подвох с хедерами, которые не отражаются в списке на анализ, но приводят к кардинальным изменениям в том, во что включаются

Ilia
14.09.2018
19:02:47

Igor
14.09.2018
19:03:35

Denis
14.09.2018
19:03:59

Dark
14.09.2018
19:05:05

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

Igor
14.09.2018
19:06:43

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

Ilia
14.09.2018
19:07:47

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

Ilia
14.09.2018
19:08:52

Igor
14.09.2018
19:10:00

Ilia
14.09.2018
19:12:09