指针到指针的reinterpret_cast转换是否属于C++未定义行为?
把int转换为void的reinterpret_cast是否符合C++标准?
核心结论
在CUDA开发的实际场景中,这种写法是官方认可且广泛使用的,但从严格C++标准角度,存在潜在的未定义行为风险。
C++标准层面的分析
违反类型别名规则
执行reinterpret_cast<void**>(&p)时,是将int**类型指针转换为void**类型,随后通过这个转换后的指针让cudaMalloc写入void*值。根据C++严格类型别名规则,不能通过void**类型的左值修改int*类型的对象,这类操作属于未定义行为。指针表示无标准保证
C++标准仅保证:任意对象类型的指针可转换为void*,再转换回原类型指针时能得到原值。但对于指针的指针(如int**和void**),标准不要求它们的内存表示、大小或对齐方式一致——尽管绝大多数主流平台(包括CUDA目标平台)都满足指针布局统一的前提,但标准本身不做强制规定。
CUDA场景下的实际情况
- NVIDIA官方文档和示例代码中大量使用该转换方式,因为CUDA的目标平台(x86_64、ARM等)均满足“所有对象指针的大小和表示与
void*完全一致”的条件,实际运行中不会出现问题。 - 若想完全符合C++标准、规避潜在风险,可改用中间变量的写法:
这种写法通过void* temp_ptr; cudaMalloc(&temp_ptr, 123); int* p = static_cast<int*>(temp_ptr);static_cast在void*与int*之间转换,完全符合C++标准,不存在未定义行为。
内容的提问来源于stack exchange,提问作者user1011113
相关产品推荐
相关产品推荐

