在C++中重新解释测试使用

Reinterpret_cast use in C++

本文关键字:解释 测试 C++ 新解释      更新时间:2023-10-16

这只是一个简单的问题:

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); 

提前感谢

Antonio

当前问题的答案

不同的是,他们做的是两件完全不同的事情!

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

对于第一种合理的代码,H应该是指向fftw_complex实例的指针(可能键入为void*?(。这样做是为了告诉编译器H实际上是fftw_complex*,这样你就可以使用它了

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

原始答案

主要区别在于,在第二种情况下,您可以在源代码中搜索reinterpret_cast(并希望确保每一次使用都有明确的文档记录和必要的危害(。

但是,如果要从void*强制转换为另一种指针类型(这里是这种情况吗?(,则最好使用static_cast(也可以很容易地搜索(。

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或-上帝保佑-double重新解释为指针(。

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

在c样式强制转换和static_casts用于无害强制转换的最丑陋的位置,通常会保留重新解释_强制转换。基本上,您可以使用repret_cast来标记一些非常丑陋的代码:

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

这样,这些丑陋的、不安全的类型转换是可搜索/可擦除的。