2012-08-13 304 views
1

(void **)& x和(void *)x之间的区别是什么?我会给你一些代码,请帮助我。(void **)&x和(void *)x有什么区别?

float *xd; 
int size=width*width*size(float); 
cudaMalloc((void **)&x,size); 1 
cudaMalloc((void *)x,size); 2 
cudaMalloc(&x,size);   3 
cudaMalloc(*x,size);   4 

cudaFree(xd); 

我只是想知道区别。

的cudaMalloc()函数的第一个参数是一个指针变量必须分配之后指向已分配对象的地址。指针变量的地址应该转换为(void **),因为函数需要一个通用指针值;内存分配函数是一个通用函数,不限于任何特定类型的对象。该地址允许cudaMalloc()函数将分配对象的地址写入指针变量中。cudaMalloc()函数的第二个参数以字节为单位给出了要分配的对象的大小。第二个参数的用法与C malloc()函数的size参数一致。

+0

[C++ decl](http://linux.die.net/man/1/c++decl)可能在这里使用 – Eric 2012-08-13 02:31:02

+3

它与&x和x之间的区别非常相似。不知道为什么你会认为两件完全不同的事情是相同的,这样的问题是没有用的。 – 2012-08-13 02:44:01

回答

6

他们只是完全不同

此:

(void **)&x 

需要的x地址并将其转换为void**(指针的指针的void)。

此:

(void *)x 

价值x并将其转换为void*

它们都是指针,但它们指向内存中完全不同的位置(除非x恰好包含自己的地址),它们是不同的类型。

如果你想向我们展示的代码,这将有助于向我们展示了实际编译代码。复制并粘贴您的实际源代码;不要重新输入。您还没有表现出我们的x声明(是xdx一个错字?),和size(float)是一个语法错误(你的意思是sizeof(float)?)。

2

为了让您更好的了解为什么cudaMalloc你经常写(void**)&var,考虑以下因素:

cudaMalloc分配的GPU内存。它引用的存储器类型是void*,因为它并不关心数据类型。

一旦我们有我们刚刚分配的cudaMalloc内部的存储器的地址,我们需要以某种方式返回给调用者。但所有CUDA API函数都返回错误代码(或成功代码),并且任何其他返回的数据都必须由参数引用传回。

C语言没有通通过引用,所以你真的需要一个指针传递到你想要的功能,以存储结果的变量。既然你想存储一个指针值,你需要传递一个指针指针。因此void**类型。

如果一个人想封装在类似的方式malloc的,一个会写这样的事:

void myMalloc(void** ret, size_t size) { 
    void* mem = malloc(size); 
    *ret = mem; 
} 

现在,如果你通过(void**)&varmyMalloc,该功能将能够覆盖var的价值---因为ret会指向var变量。

这是否使它更清晰?

相关问题