在C++中重新解释测试使用
Reinterpret_cast use in C++
这只是一个简单的问题:
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);
这样,这些丑陋的、不安全的类型转换是可搜索/可擦除的。
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 请解释"函数1(p1,p2,p3);"的输出
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 尽管测试成功,CppUnit测试核心仍被丢弃.为什么
- 数据成员SFINAE的C++17测试:gcc vs clang
- 被解释为低级别const的const对象的地址
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么二进制搜索在我的测试中不起作用
- 从父数组测试用例构造二叉树失败
- 计算每个节点的树高,帮助我解释这个代码解决方案
- MSVC将仅移动结构参数解释为指针
- 试图对缓存进行跨步测试,但程序并没有结束
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- OpenGL在启用深度测试时不会丢弃我的碎片
- 为测试目标创建具有不同源文件夹的文件
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 缓存错过压力测试:令人惊叹的结果.任何解释
- 在C++中重新解释测试使用
- 解释位测试宏在c++