簡體   English   中英

C ++:如何獲取浮點指針的地址並將其轉換為void **

[英]C++: How to get the address of a float pointer and convert it to void**

在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:我仍然不太了解右值引用,因此如果這是菜鳥錯誤,請原諒我)

編輯 --------------

對不起,我沒有說清楚。 我不想在這里聲明一個void * 我只是想以某種方式執行“適當的” C ++強制轉換才能完成此操作,最好僅一行完成。

更多編輯 ----------

我確實理解使用void *的正確方法,如@MM在下面指出的(實際上,這正是我現在已經做的一段時間了)。 我只是好奇是否有任何避免使用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將這些塊包裝成一個智能指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM