我正在浏览SpiderMonkey引擎源,并在解释器中看到一些令我感兴趣的代码.
// Portable switch-based dispatch. # define INTERPRETER_LOOP() the_switch: switch (switchOp) # define CASE(OP) case OP: # define DEFAULT() default:
(来源:https://dxr.mozilla.org/mozilla-b2g44_v2_5/source/js/src/vm/Interpreter.cpp#1579)
定义类似案例OP的任何非风格的好处:作为CASE(OP)?
解决方法
Look up半屏:
#if (defined(__GNUC__) || \ (__IBMC__ >= 700 && defined __IBM_COmpuTED_GOTO) || \ __SUNPRO_C >= 0x570) // Non-standard but faster indirect-goto-based dispatch. # define INTERPRETER_LOOP() # define CASE(OP) label_##OP: // ... <snip> #else // Portable switch-based dispatch. # define INTERPRETER_LOOP() the_switch: switch (switchOp) # define CASE(OP) case OP: // ... <snip> #endif
GCC和其他一些编译器支持“computed goto”,即faster than a loop-switch for an interpreter loop,但是是非标准的,因此不可移植.
如果编译器支持计算的goto,则#if的第一个分支定义了INTERPRETER_LOOP,CASE(OP)等,以使用计算的goto;否则,#else分支根据标准设施来定义它们.
原文地址:https://www.jb51.cc/c/111866.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。