为什么有必要转换为 void**(例如在 cudaMalloc 调用中)?
Why is it necessary to cast to void** (e.g. in cudaMalloc calls)?
cudaMalloc()
函数是 defined 使用:
cudaMalloc (
void ** devPtr,
size_t size)
响应here and here很好地解释了为什么函数应该被定义为接受指向指针的指针。
但是,我不太清楚为什么我们需要将调用函数时提供的参数类型强制转换为类型 void**。例如。在函数调用中:
catch_status = cudaMalloc((void**)&device_array, num_bytes);
已提交 here。
据我了解,定义一个接受 void 类型的函数可以赋予它更大的灵活性。 IE。查看 cudaMalloc()
函数的定义,我将其解释为它可以接受指向任何类型对象的指针的指针。因此,为什么在调用函数时必须键入 cast &device_array
(在上面的示例中)。 (这种类型转换的语法在我在整个网络上看到的 cudaMalloc()
示例中似乎非常普遍)。只要 &device_array
满足它是 "pointer to a pointer of any type of data" 的条件,还不足以 (a) 满足 cudaMalloc()
接受的参数的函数定义和 (b) 完成任何编程我们有什么目标?
我在这里错过了什么?
转换为 void**
总是错误的,因为这种类型不是 generic pointer。
因此,当一个函数有一个类型为 void**
的参数时,传递给它的参数的唯一类型可以是类型:void**
,使得任何类型转换都是错误的或不必要的。
从 cudaMalloc 获取内存的正确方法(忽略错误检查)是:
void* mem;
cudaMalloc( &mem , num_int_bytes );
int* array = mem;
cudaMalloc( &mem , num_double_bytes );
double* floating = mem;
cudaMalloc()
函数是 defined 使用:
cudaMalloc (
void ** devPtr,
size_t size)
响应here and here很好地解释了为什么函数应该被定义为接受指向指针的指针。
但是,我不太清楚为什么我们需要将调用函数时提供的参数类型强制转换为类型 void**。例如。在函数调用中:
catch_status = cudaMalloc((void**)&device_array, num_bytes);
已提交 here。
据我了解,定义一个接受 void 类型的函数可以赋予它更大的灵活性。 IE。查看 cudaMalloc()
函数的定义,我将其解释为它可以接受指向任何类型对象的指针的指针。因此,为什么在调用函数时必须键入 cast &device_array
(在上面的示例中)。 (这种类型转换的语法在我在整个网络上看到的 cudaMalloc()
示例中似乎非常普遍)。只要 &device_array
满足它是 "pointer to a pointer of any type of data" 的条件,还不足以 (a) 满足 cudaMalloc()
接受的参数的函数定义和 (b) 完成任何编程我们有什么目标?
我在这里错过了什么?
转换为 void**
总是错误的,因为这种类型不是 generic pointer。
因此,当一个函数有一个类型为 void**
的参数时,传递给它的参数的唯一类型可以是类型:void**
,使得任何类型转换都是错误的或不必要的。
从 cudaMalloc 获取内存的正确方法(忽略错误检查)是:
void* mem;
cudaMalloc( &mem , num_int_bytes );
int* array = mem;
cudaMalloc( &mem , num_double_bytes );
double* floating = mem;