Reinterpret_cast использовать в C ++ - PullRequest
0 голосов
/ 15 июля 2011

Просто простой вопрос, имеющий это:

fftw_complex *H_cast;
H_cast = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*M*N);

В чем разница между:

H_cast=  reinterpret_cast<fftw_complex*> (H); 

и

H_cast= reinterpret_cast<fftw_complex*> (&H); 

Большое спасибо заранее

Антонио

Ответы [ 3 ]

3 голосов
/ 15 июля 2011

Ответ на текущий вопрос

Разница в том, что они делают две совершенно разные вещи!

Примечание: вы не говорите нам, что Hтак что невозможно ответить на вопрос с уверенностью.Но применяются общие принципы.

Для того чтобы первый случай был разумным кодом, H должен быть указателем (возможно, напечатанным как void*?) На экземпляр fftw_complex.Вы должны сделать это, чтобы сообщить компилятору, что H действительно fftw_complex*, поэтому вы можете использовать его.

Чтобы второй случай был разумным кодом, H должен быть экземпляромкласс с макетом памяти, идентичным классу fftw_complex.Я не могу придумать вескую причину поставить себя в такую ​​ситуацию, это очень неестественно.Исходя из этого, и поскольку вы не предоставляете нам информацию относительно H, я думаю, что это почти наверняка ошибка.

Оригинальный ответ

Основное отличие заключается вчто во втором случае вы можете искать в своем исходном коде reinterpret_cast (и, надеюсь, убедиться, что каждое использование четко документировано и является необходимым злом).

Однако, если вы преобразуете из void* в другой указательвведите (это здесь?), тогда вместо него предпочтительнее использовать static_cast (который также можно легко найти).

1 голос
/ 15 июля 2011
H_cast=  reinterpret_cast<fftw_complex*> (H); 

Это преобразует тип указателя в H (или само целое число, если H целочисленный тип) и сообщает компилятору: «Это указатель. Хватит думать, что бы это ни было, теперь это указатель». H используется как то, где вы сохранили адрес, похожий на указатель.

H_cast= reinterpret_cast<fftw_complex*> (&H); 

Это преобразует адрес H (который является указателем на любой тип H) в указатель на "fftw_complex". Изменение содержимого H_cast теперь изменит самого H.

Вам понадобится второе, если H не указатель, и обычно первое, если оно есть. Существуют варианты использования для обратного, но они необычны и безобразны (особенно переосмысление типа int или - не дай бог - двойного в качестве указателя).

0 голосов
/ 15 июля 2011

Приведение указателей всегда выполняется как reinterpret_cast, поэтому при приведении из или в пустоту * нет разницы между приведением в стиле c, static_cast или reinterpret_cast.

Reinterpret_casts обычно зарезервированы для самых уродливых мест, где броски в стиле c и static_casts используются для безобидных приведений. Вы в основном используете reinterpret_cast, чтобы пометить некоторый код как действительно уродливый:

float f = 3.1415f;
int x = *reinterpret_cast<int *>(&f);

Таким образом, эти уродливые небезопасные броски доступны для поиска / поиска.

...