为什么有必要转换为void**(例如在cudaMalloc调用中)?

Mic*_*gge 2 c pointers cuda void-pointers

cudaMalloc()函数使用以下定义:

cudaMalloc ( 
  void ** devPtr, 
  size_t size)
Run Code Online (Sandbox Code Playgroud)

这里这里的响应很好地解释了为什么应该定义函数来接受指向指针的指针.

但是,我不太清楚为什么我们需要在调用函数类型为void**时输入我们提供的参数.例如,在函数调用中:

catch_status = cudaMalloc((void**)&device_array, num_bytes);
Run Code Online (Sandbox Code Playgroud)

呈现在这里.

据我了解,定义一个接受void类型的函数可以提供更大的灵活性.即看看cudaMalloc()函数的定义,我将其解释为它可以接受指向任何类型对象的指针.因此,为什么&device_array在调用函数时需要输入强制转换(在上面的例子中).(这种类型转换的语法在cudaMalloc()我在整个网络中看到的例子中似乎非常普遍).只要&device_array满足它是"指向任何类型数据的指针"的条件,就不足以(a)满足参数cudaMalloc()接受的函数定义和(b)完成我们的编程目标吗?

我在这里错过了什么?

小智 7

转换void**为始终是错误的,因为此类型不是通用指针.

因此,当函数具有void**类型的参数时,传递给它的唯一类型的参数可以是类型:void**,使任何强制转换错误或不必要.

从cudaMalloc获取内存的正确方法(忽略错误检查)是:

void* mem;
cudaMalloc( &mem , num_int_bytes );
int* array = mem;

cudaMalloc( &mem , num_double_bytes );
double* floating = mem;
Run Code Online (Sandbox Code Playgroud)

  • "施放到'void**'总是错的" - 不,不是:`void*x; void*y =&x; void*z;*(void**)y =&z;` (3认同)