V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
tailf
V2EX  ›  问与答

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

  •  
  •   tailf · Mar 9, 2018 · 3248 views
    This topic created in 2982 days ago, the information mentioned may be changed or developed.
    C++ 编译之后直接成为二进制,而图灵机只能按照顺序一个指令一个指令地执行,那么 try catch 是怎么实现的呢?

    解释型语言的 try catch 好理解,但是 C++ 的真的想不通。
    9 replies    2018-03-13 11:27:47 +08:00
    ipwx
        1
    ipwx  
       Mar 9, 2018
    longjmp?
    innoink
        2
    innoink  
       Mar 9, 2018 via Android
    这和图灵机有什么关系,哪个语言不是图灵机?
    dandycheung
        3
    dandycheung  
       Mar 9, 2018 via Android
    这么复杂的专业领域知识,为什么不先去读读相关著作再来提问呢?
    htfy96
        4
    htfy96  
       Mar 9, 2018   ❤️ 1
    没有规定实现,不过可以看看 http://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html#cxx-abi 的 2.4/2.5
    NagisaFurukawa
        5
    NagisaFurukawa  
       Mar 9, 2018
    SEH 了解一下
    ysc3839
        6
    ysc3839  
       Mar 9, 2018
    编译后逆向看看就知道了。不同编译器可能有不同实现的。
    gnaggnoyil
        7
    gnaggnoyil  
       Mar 9, 2018   ❤️ 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  
       Mar 10, 2018
    要抱着孤立和分层的观点看问题
    并不是每两个事务之间都有直接关系
    tailf
        9
    tailf  
    OP
       Mar 13, 2018
    学习了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   971 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 55ms · UTC 20:17 · PVG 04:17 · LAX 13:17 · JFK 16:17
    ♥ Do have faith in what you're doing.