Когда идентификатор типа может возвратить различные type_info экземпляры для того же типа?

Думайте об индексе, подобном карточному каталогу в библиотеке. Индекс мешает Вам иметь для поиска каждого острова или полки для книги. Вместо этого можно быть в состоянии найти объекты, которые Вы хотите от наиболее часто используемого поля, такой как и идентификатор, Имя, и т.д. при создании индекса, база данных в основном создает что-то отдельное, к которому мог совершить нападки запрос вместо того, чтобы сканировать всю таблицу. Вы ускоряете запрос, позволяя ему искать меньшее подмножество данных или оптимизированный набор данных.

10
задан dalle 30 November 2009 в 11:33
поделиться

2 ответа

Есть ли времена, когда &typeid(T) != &typeid(T)?

Меня в основном интересуют компиляторы для Windows, но любая информация для Linux и других платформ тоже ценится.

Да. Таким образом, под Windows DLL не может иметь неразрешенных символов. Если у вас есть:

foo.h

struct foo { virtual ~foo() {} };

dll.cpp

#include "foo.h"
...
foo f;
cout << &typeid(&f) << endl

main.cpp

#include "foo.h"
...
foo f;
cout << &typeid(&f) << endl

даст вам разные указатели. Потому что до загрузки dll должен существовать typeid(foo). как в dll, так и в первичном exe

Более того, под Linux, если бы основной исполняемый файл не был скомпилирован с -rdynamic (или --export-dynamic), то typeid в исполняемом файле разрешался бы на различные символы и в общем объекте (что обычно не происходит на платформах ELF) из-за некоторых оптимизаций, выполняемых при линковке исполняемого файла -- удаление ненужных символов.

.
10
ответ дан 4 December 2019 в 01:01
поделиться

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

какая-либо конкретная причина, по которой вам нужно иметь возможность сравнивать TypeIds на основе их адреса в памяти? TypeIds уже переопределяет == и! =, Чтобы дать вам возможность сравнивать их и предоставить имя (), которое может использоваться для их уникальной идентификации.

Если вы ' У нас есть язык программирования C ++ (Bjarne Stroustrup), в главе 15 содержится много деталей об обработке иерархий классов. Может быть, вы найдете там другое решение?

1
ответ дан 4 December 2019 в 01:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: