指向设备对象成员的指针
Pointer to member of device object
我知道,我不应该取消引用指向设备的指针。但以下是一个取消引用吗?
struct example{
int a;
float b;
};
void test(){
example* p_e;
cudamalloc(&p_e,sizeof(example));
float* db = &p_e->b; // is this line valid?
}
它在我的电脑上工作,但这个有效吗?
编辑:
有了它,我的意思是,它在我的测试运行中保持着:
reinterpret_cast<void*>(&p_e->b) == reinterpret_cast<void*>(reinterpret_cast<unsigned char*>(p_e)+sizeof(int))
关于此:
float db = &p_e->b;
我无法想象C或C++中实体的地址是float
值的情况。因此,从语言的角度来看,这毫无意义。如果我们将其修改为:
float *db = &p_e->b;
这是一个合理的构造,尽管它是否"有用"取决于您打算如何使用它。获取位置p_e->b
的地址需要获取包含在p_e
(主机内存中的一个位置,因此没有设备取消引用(中的指针值,并将对象中位置b
的偏移量添加到其中。该偏移不涉及任何取消引用。它可以简单地通过检查类/结构定义来计算。因此,这些都不需要对指针进行任何取消引用。
生成的指针(db
(现在指向设备内存中的某个位置,因此指针只能在设备代码中使用(取消引用(。但是,您可以按值将指针传递给CUDA内核,并合理地"使用"它。
如果您实际上打算用指针p_e->b
所指向的float
内容填充值db
,首先您的代码不会这样做,其次,当使用cudaMalloc
分配底层基本结构指针(b_e
(时,在主机代码中通常不可能直接从设备检索该数据。
相关文章:
- 从成员指针到整个结构/类的强制转换
- OOP 中的单成员指针
- 使用结构成员指针在C++中填充结构
- 聚合初始化,将成员指针设置为同一结构成员
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 共享 C++ 的数据成员指针
- 如何声明指向成员内容的成员指针m_pmd/m_pmf并访问它们?
- 从类C++外部调用指向成员方法的成员指针
- 结构成员指针是否自动初始化为零?
- 如何删除类内类类型的类成员指针
- 是否打印指向已定义 int 的成员指针
- 指向常量的成员指针
- 通过此指针访问时的成员差异和自身的成员指针(简单的 QT 示例问题)
- 类数据成员指针的非类型模板参数包无法使用 gcc 编译
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 将类成员指针传递给 Lambda 捕获列表 c++11
- 在单一实例类中将成员指针设置为 null 的正确方法是什么
- 无法删除在destructor中的成员指针的课程
- 删除对象而不调用成员指针的析构函数
- 当派生类的基类具有成员指针时,对其进行深层复制