gpt4 book ai didi

C++:如何获取浮点指针的地址并将其转换为 void**

转载 作者:行者123 更新时间:2023-11-27 22:36:58 25 4
gpt4 key购买 nike

在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;
}

我的问题是 float ** 的类型转换至 void **使用 C 风格的类型转换让我感到厌烦,因为我不想在 C++ 编程中使用它。

到目前为止,我一直在使用 reinterpret_cast<void **>(&data)相反,但我对此并不满意。出于某种原因,我认为这不是正确的做法。

我试过做 &static_cast<void *>(data)曾经非常愚蠢,因为这显然无法从右值中获取地址。

我在 Google 和 Stack Overflow 上进行了一些搜索,但我很难为查询找到合适的关键字。

我也一直在学习右值引用的概念,但我不认为它是为这个问题而设计的。

所以我的问题是,从 float ** 进行转换的正确 C++ 方法是什么?至 void **在这种情况下?另外,有没有办法static_castvoid *并仍然从返回值中获取地址,如右值引用? (PS:我还是不太理解右值引用,菜鸟犯的错误请见谅)

编辑 --------------

对不起,我没说清楚。我不想申报 void *这里。我只是想以某种方式做一个“适当的”C++ 转换来完成这项工作,最好只用一行。

更多编辑 ----------

我明白使用 void *正确的方法,正如@M.M 在下面指出的那样(事实上,这正是我一段时间以来一直在做的事情)。我只是好奇是否有任何适当的方法可以避免使用 void * .

最佳答案

我会这样做:

void *newdata;
CUDA_CHECK(cudaMalloc(&newdata, size));
float *data = static_cast<float *>(newdata);

CUDA_CHECK(cudaFree(data)); // or pass newdata, doesn't matter

很明显,我会用 RAII 将这些 block 包装到一个智能指针中。

关于C++:如何获取浮点指针的地址并将其转换为 void**,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53021055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com