Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, AlexGin, Вы писали:
AG>>Как он может иметь разные размерности в одном и том же процессе?
U>рекомендую к прочтению: https://stackoverflow.com/questions/16062651/about-sizeof-of-a-class-member-function-pointer
Спасибо.
Я вообще к чему это всё — в техникуме нас учили языку Си. С тех пор я как-то привык что в
void* можно положить любой указатель. И был удивлён, что это не так. В одном проекте у нас интроспекция строилась через void*. И вроде как библиотека
cpgf на это завязана. Выходит, там либо этот момент учтён, либо мне просто везло (в своих велосипедах я никогда не пользовался void*).
Здравствуйте, Croessmah, Вы писали:
C>Здравствуйте, SaZ, Вы писали:
SaZ>>Я вообще к чему это всё — в техникуме нас учили языку Си. С тех пор я как-то привык что в void* можно положить любой указатель. И был удивлён, что это не так.
C>К слову, в C даже указатель на функцию нельзя преобразовывать в указатель на данные (в т.ч. в void*). Такое преобразование является возможным, но имеет неопределенный результат и не является переносимым. Но, например, POSIX требует чтобы такое преобразование было валидным.
Я правильно понял, что стандарт никак не обязует компиляторы использовать какой-то фиксированный размер указателя для определённого типа данных? Т.е. чисто теоретически возможна ситуация, когда
struct A // ...
{
virtual void f(){}
};
struct B // ...
{
virtual void f(){}
};
sizeof( &A::f ) != sizeof( &B::f ); // ?
В общем, если делать свою интроспекцию, то надо делать отдельные типы для хранения 1) указатели на поля, 2) указатели на методы, 3) указатели на виртуальные методы, 4) что-то ещё?