我们需要将
int**
转换为 void**
,为此可以使用 reinterpret_cast
。然而,它在技术上是 C++ 标准允许的,还是我们处于未定义行为领域?
用例
使用Nvidia库时我们需要使用指针到指针:
cudaMalloc(void** ptr, size_t size);
所以典型的解决方案是:
int* p;
cudaMalloc(reinterpret_cast<void**>(&p), 123);
转换本身总是没问题的,假设
int**
不是无效的指针值。
但是,如果
alignof(void**) > alignof(int**)
,那么原始指针可能没有与 void**
适当对齐,然后转换的结果将是未指定的,任何使用都会导致未定义的行为。那么也不可能恢复到原始值。
否则,强制转换、传递指针以及强制转换回
int**
都可以,但是通过 void**
访问将是别名冲突,因为 void*
不能为 int*
起别名。因此,如果 cudaMalloc
访问指针而不首先转换回 int**
,则行为未定义。
这就是 C++ 标准对此的全部规定。鉴于您似乎专门询问了 CUDA,这当然可以做出额外的保证。