指针到指针的reinterpret_cast - 这是未定义的行为吗?

问题描述 投票:0回答:1

我们需要将

int**
转换为
void**
,为此可以使用
reinterpret_cast
。然而,它在技术上是 C++ 标准允许的,还是我们处于未定义行为领域?

用例

使用Nvidia库时我们需要使用指针到指针:

cudaMalloc(void** ptr, size_t size);

所以典型的解决方案是:

int* p;
cudaMalloc(reinterpret_cast<void**>(&p), 123);
c++ language-lawyer undefined-behavior
1个回答
0
投票

转换本身总是没问题的,假设

int**
不是无效的指针值。

但是,如果

alignof(void**) > alignof(int**)
,那么原始指针可能没有与
void**
适当对齐,然后转换的结果将是未指定的,任何使用都会导致未定义的行为。那么也不可能恢复到原始值。

否则,强制转换、传递指针以及强制转换回

int**
都可以,但是通过
void**
访问将是别名冲突,因为
void*
不能为
int*
起别名。因此,如果
cudaMalloc
访问指针而不首先转换回
int**
,则行为未定义。

这就是 C++ 标准对此的全部规定。鉴于您似乎专门询问了 CUDA,这当然可以做出额外的保证。

© www.soinside.com 2019 - 2024. All rights reserved.