Re[8]: Безопасно ли присваивать один указатель другому?..
От: SaZ  
Дата: 29.03.18 14:31
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, AlexGin, Вы писали:


AG>>Как он может иметь разные размерности в одном и том же процессе?


U>рекомендую к прочтению: https://stackoverflow.com/questions/16062651/about-sizeof-of-a-class-member-function-pointer


Спасибо.
Я вообще к чему это всё — в техникуме нас учили языку Си. С тех пор я как-то привык что в void* можно положить любой указатель. И был удивлён, что это не так. В одном проекте у нас интроспекция строилась через void*. И вроде как библиотека cpgf на это завязана. Выходит, там либо этот момент учтён, либо мне просто везло (в своих велосипедах я никогда не пользовался void*).
Re[9]: Безопасно ли присваивать один указатель другому?..
От: Croessmah  
Дата: 30.03.18 09:09
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>Я вообще к чему это всё — в техникуме нас учили языку Си. С тех пор я как-то привык что в void* можно положить любой указатель. И был удивлён, что это не так.


К слову, в C даже указатель на функцию нельзя преобразовывать в указатель на данные (в т.ч. в void*). Такое преобразование является возможным, но имеет неопределенный результат и не является переносимым. Но, например, POSIX требует чтобы такое преобразование было валидным.
Отредактировано 30.03.2018 9:50 Croessmah . Предыдущая версия .
Re[4]: Безопасно ли присваивать один указатель другому?..
От: alpha21264 СССР  
Дата: 30.03.18 09:46
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>Указатель не обязан читаться/писаться атомарно, и в каком--то случае может переключиться контекст, и 2-ю часть перезапишут в другом потоке.


Какие ужасы вы рассказываете! Что же в таком случае происходит с другими типами данных, например с int-ами?

Течёт вода Кубань-реки куда велят большевики.
Re[10]: Безопасно ли присваивать один указатель другому?..
От: SaZ  
Дата: 30.03.18 11:48
Оценка:
Здравствуйте, 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) что-то ещё?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.