在C ++中使用Reinterpret_cast

时间:2011-07-15 12:23:56

标签: c++ fftw reinterpret-cast

这是一个简单的问题:

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 个答案:

答案 0 :(得分:3)

回答当前的问题

不同之处在于他们做了两件完全不同的事情!

注意:您没有告诉我们H是什么,所以无法自信地回答这个问题。但一般原则适用。

对于第一个是合理代码的情况,H应该是void*实例的指针(可能输入fftw_complex?)。你这样做是为了告诉编译器H真的是fftw_complex*,所以你可以使用它。

对于第二种情况是敏感代码,H应该是类的实例,其内存布局与类fftw_complex的内存布局相同。我想不出让自己处于这种状况的令人信服的理由,这是非常不自然的。基于此,由于您没有向我们提供有关H的信息,我认为这几乎肯定是一个错误。

原始回答

主要区别在于,在第二种情况下,您可以搜索reinterpret_cast的源代码(并希望确保每次使用都有明确记录并且是必要的恶意)。

但是,如果你从void*转换到另一个指针类型(这是这里的情况?),那么最好使用static_cast代替(也可以轻松搜索)。

答案 1 :(得分:1)

H_cast=  reinterpret_cast<fftw_complex*> (H); 

这会将指针-theh类型转换为H(或整数本身,如果H是整数类型)并告诉编译器“这是一个指针。停止思考它是什么,它现在是指针”。 H用作存储指针式地址的东西。

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

这将H的地址(它是指向H的任何类型的指针)转换为指向“fftw_complex”的指针。修改H_cast的内容现在将改变H本身。

如果H不是指针,你会想要第二个,如果是,那么通常是第一个。反过来有用例,但它们不常见和丑陋(特别是重新解释int或 - 上帝禁止 - 一个double作为指针)。

答案 2 :(得分:0)

指针强制转换始终作为reinterpret_cast执行,因此当从或转换为void *时,c样式转换,static_cast或reinterpret_cast之间没有区别。

Reinterpret_casts通常保留给c-style强制转换和static_casts用于无害强制转换的最丑陋的位置。你基本上使用reinterpret_cast来标记一些非常丑陋的代码:

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

这样,这些丑陋的不安全演员表是可搜索/可以搜索的。