像(void**)&device | 您所在的位置:网站首页 › void返回值 › 像(void**)&device |
问题是void*在C中有一个特殊的含义,有特殊的规则(1)。它是唯一可以安全转换任何其他指针类型的指针类型。但是,这些特殊规则并不递归地应用于void**。 意味着像int* ptr = malloc(x);这样的代码是非常好的,但是 int* ptr; cudaMalloc(&ptr, x); // bad不太好!从int**到void**的指针转换没有很好地定义.从理论上讲,这可能导致未定义的行为和失调(2)。 此外,指针混叠也可能存在问题。编译器可以自由地假设void*的内容从未通过int**访问,因此可以以意想不到的方式优化代码,从而导致违反严格混叠规则(6.5)的未定义行为。 这意味着为了安全地使用该函数,您必须编写这样的代码: void* vptr; int* iptr; cudaMalloc(&vptr, x); iptr = vptr;(1) C11 6.3.2.3/1: 指向空的指针可以转换为指向任何对象类型的指针,也可以从指向任何对象类型的指针转换。指向任何对象类型的指针可以再次转换为无效指针和返回指针;结果应与原始指针相比较。 (2) C11 6.3.2.3/7: 指向对象类型的指针可以转换为指向不同对象类型的指针。如果结果指针未针对引用类型正确对齐,则行为未定义。 |
CopyRight 2018-2019 实验室设备网 版权所有 |