【发布时间】:2018-10-27 10:39:11
【问题描述】:
在 C++ 编程中,我经常需要获取指针的地址并将其转换为void **。例如,通常在使用 CUDA 时:
int main() {
float *data;
size_t size = sizeof(float) * 1024;
CUDA_CHECK(cudaMalloc((void **)&data, size)); // question about this line
...
CUDA_CHECK(cudaFree(static_cast<void *>(data)));
return 0;
}
我的问题是使用 C 风格类型转换将 float ** 转换为 void ** 让我很恼火,因为我不想在 C++ 编程中使用它。
到目前为止,我一直在使用reinterpret_cast<void **>(&data),但我对此并不满意。出于某种原因,我认为这不是正确的做法。
我曾经非常愚蠢地尝试过&static_cast<void *>(data),因为尝试从右值获取地址显然失败了。
我在 Google 和 Stack Overflow 上进行了一些搜索,但我很难为查询找到合适的关键字。
我也一直在学习右值引用的概念,但我不认为它是为这个问题而设计的。
所以我的问题是,在这种情况下,从 float ** 转换为 void ** 的正确 C++ 方法是什么?另外,有没有办法将static_cast 到void * 并仍然从返回值中获取地址,比如右值引用? (PS:我还是不太明白rvalue reference,如果这是菜鸟的错误请见谅)
编辑 --------------
对不起,我没有说清楚。我不想在这里声明void *。我只是想以某种方式做一个“正确的”C++ 演员来完成这件事,最好只用一行。
更多编辑 ----------
我明白使用void * 的正确方式,正如@M.M 在下面指出的那样(事实上,这正是我一段时间以来一直在做的事情)。我只是好奇是否有任何适当的方法可以避免使用void *。
【问题讨论】:
-
使用
reinterpret_cast<void**>(&data)是在这里投射的“正确”方式。 -
为什么这个库采用
void **参数,而void *就可以了? -
@SidS • 看起来它是 C++ 中
void*&参数的 C API 等效项。 -
@SidS 它是一个“out”参数,函数“返回”一个
void *值并使用函数返回值作为错误代码