cuda中内存申请使用void**的原因
2010-03-22 18:01
381 查看
cuda中的内存申请都是使用的void**,为什么要用void**原因如下.
通常我们写函数时,如果将一个指针作为参数传给某个函数,其实这个指针是被复制了一份的,不过新复制的指针指向的地址是和原来那个相同的。如
void memalloc(int * p1){
p1 = (int*)malloc(10);
}
int main(){
int * a = 0x1122;
memalloc(a);
}
此时a指向的地址为0x1122,而将a传给memalloc后,p1指向的地址还是0x1122,但是p1和a是两个不同的指针,他们两个在内存中有不用的地址空间。
所以如果使用上面的方法申请内存的话,p1是指向新的内存的,但是a还是指向了0x1122,内存是无法通过a访问的。
在cuda中使用void**来解决这个问题
void memalloc(void ** p1){
*p1 = malloc(10);
}
int main(){
int * a = 0x1122;
memalloc((void**)&a);
}
上述方法将a的地址作为参数传给了memalloc,这个好处在于p1相当于指向a的地址的指针,而*p1才是真正a的地址。
通过对*p1进行内存申请,效果是等同于对a进行内存申请。
使用这个方法的好处是可以对内存分配进行封装,有效改善代码质量。
通常我们写函数时,如果将一个指针作为参数传给某个函数,其实这个指针是被复制了一份的,不过新复制的指针指向的地址是和原来那个相同的。如
void memalloc(int * p1){
p1 = (int*)malloc(10);
}
int main(){
int * a = 0x1122;
memalloc(a);
}
此时a指向的地址为0x1122,而将a传给memalloc后,p1指向的地址还是0x1122,但是p1和a是两个不同的指针,他们两个在内存中有不用的地址空间。
所以如果使用上面的方法申请内存的话,p1是指向新的内存的,但是a还是指向了0x1122,内存是无法通过a访问的。
在cuda中使用void**来解决这个问题
void memalloc(void ** p1){
*p1 = malloc(10);
}
int main(){
int * a = 0x1122;
memalloc((void**)&a);
}
上述方法将a的地址作为参数传给了memalloc,这个好处在于p1相当于指向a的地址的指针,而*p1才是真正a的地址。
通过对*p1进行内存申请,效果是等同于对a进行内存申请。
使用这个方法的好处是可以对内存分配进行封装,有效改善代码质量。
相关文章推荐
- cuda纹理内存使用例子 vs2013 cuda7.5
- cuda 内存分类和使用
- 在DISPATCH_LEVEL或更高LEVEL不能使用分页内存的根本原因
- cuda常量内存的使用
- 内存降频使用的其中一个原因
- Android中MVP模式的使用及内存泄漏原因分析(一)
- UIImage转化UIColor时造成的内存使用增加的原因
- CUDA Unified Memory统一内存使用注意
- 使用NSString的stringWithUTF8String内存狂涨的原因之一(FMDB中)
- (CUDA 编程8).CUDA 内存使用 global 二------GPU的革命
- cuda纹理内存的使用
- 使用malloc函数申请内存空间注意事项
- C语言基础之函数、虚拟键盘的使用、数组、指针、动态申请内存、内存泄漏
- 简单的介绍一下C中申请的内存空间,free的使用
- Android 内存泄露原因及使用MAT工具分析
- mark/reset方法的使用以及导致内存溢出的原因(java)
- Ubuntu 使用top/free查看内存占用大的原因
- C语言内存申请与使用
- varnish服务器在内存大量富余时使用交换空间的原因及解决方法