gpt4 book ai didi

C++ 异常二进制兼容性

转载 作者:太空狗 更新时间:2023-10-29 19:41:11 28 4
gpt4 key购买 nike

我的项目使用了 2 种不同的 C++ 编译器,g++ 和 nvcc(cuda 编译器)。我注意到从 nvcc 目标文件抛出的异常没有在 g++ 目标文件中捕获。

C++ 异常应该在同一台机器上是二进制兼容的吗?什么会导致这种行为?

try { kernel_= new cuda:: Kernel(); }
catch (...) { kernel_= NULL; }

// nvcc object
cuda:: Kernel:: Kernel () {
...
if (! impl_) throw;
}

其他一切似乎都有效(C++ 对象、运算符)。老实说,我不太了解异常,所以上面的代码可能有错误。

最佳答案

很抱歉在一个晚上给你两个“否”的答案,但是“否”,C++ 异常(或与此相关的类)没有标准的二进制布局。尝试在两个不同的编译器之间使用 C++ 类/异常会破坏 One Definition Rule .

您可以通过只允许对象文件之间使用 C API(因为 C 有一个标准的 ABI - 应用程序二进制接口(interface))来解决这个问题,或者您可以使用一个编译器或其他。不过,我不确定 NVCC 是否可以实现最后一点。

作为对问题编辑的回应:其他一切似乎都有效(C++ 对象、运算符):在绝大多数情况下,似乎很多事情都有效.这并不意味着它们不会调用未定义的行为。

关于C++ 异常二进制兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2619630/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com