V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
tailf
V2EX  ›  问与答

有没有大神能解决我心中的疑惑: C++ 的 try catch 是怎么实现的?

  •  
  •   tailf · 2018-03-09 15:31:25 +08:00 · 2644 次点击
    这是一个创建于 2450 天前的主题,其中的信息可能已经有所发展或是发生改变。
    C++ 编译之后直接成为二进制,而图灵机只能按照顺序一个指令一个指令地执行,那么 try catch 是怎么实现的呢?

    解释型语言的 try catch 好理解,但是 C++ 的真的想不通。
    9 条回复    2018-03-13 11:27:47 +08:00
    ipwx
        1
    ipwx  
       2018-03-09 15:41:06 +08:00
    longjmp?
    innoink
        2
    innoink  
       2018-03-09 15:48:41 +08:00 via Android
    这和图灵机有什么关系,哪个语言不是图灵机?
    dandycheung
        3
    dandycheung  
       2018-03-09 15:52:21 +08:00 via Android
    这么复杂的专业领域知识,为什么不先去读读相关著作再来提问呢?
    htfy96
        4
    htfy96  
       2018-03-09 15:55:15 +08:00   ❤️ 1
    没有规定实现,不过可以看看 http://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html#cxx-abi 的 2.4/2.5
    NagisaFurukawa
        5
    NagisaFurukawa  
       2018-03-09 15:59:32 +08:00
    SEH 了解一下
    ysc3839
        6
    ysc3839  
       2018-03-09 16:29:13 +08:00
    编译后逆向看看就知道了。不同编译器可能有不同实现的。
    gnaggnoyil
        7
    gnaggnoyil  
       2018-03-09 17:42:22 +08:00   ❤️ 2
    C++的代码和具体的机器指令又没有必然的联系."高层抽象"了解一下.首先 C 和 C++就不保证一定是 1.编译的 2.编译目标是机器指令.其次 C++的 implementation 完全可以自己插入需要的代码来获得符合要求的实现:RAII 不就是这样做的吗.POSIX 和 MINGW 的 GCC 以及 POSIX 下的 Clang 有两种异常的实现:SJLJ 和 Dwarf.Windows 下的 MSVC 和 Clang-cl 对异常的实现则是 Windows 的 SEH.不同异常的实现属于这个实现的 C++ ABI 的一部分,所以即使是同一个平台下的同一个 implementation,如果其对异常处理的实现不同的话一般情况下也是不能保证其 ABI 是互相兼容的.特别是 SJLJ,Dwarf 和 SEH 这三者两两之间 ABI 互不兼容.
    julyclyde
        8
    julyclyde  
       2018-03-10 11:48:34 +08:00
    要抱着孤立和分层的观点看问题
    并不是每两个事务之间都有直接关系
    tailf
        9
    tailf  
    OP
       2018-03-13 11:27:47 +08:00
    学习了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2496 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 01:10 · PVG 09:10 · LAX 17:10 · JFK 20:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.