c goto动态label跳转

news/2024/10/6 20:27:32

pg表达式引擎里面各个表达式的串联是使用goto动态label实现的。

// 定义部分
#if defined(EEO_USE_COMPUTED_GOTO)static const void *const dispatch_table[] = {&&CASE_EEOP_DONE,&&CASE_EEOP_INNER_FETCHSOME,&&CASE_EEOP_OUTER_FETCHSOME,&&CASE_EEOP_SCAN_FETCHSOME,&&CASE_EEOP_INNER_VAR,&&CASE_EEOP_OUTER_VAR,&&CASE_EEOP_SCAN_VAR,
...// 跳转
        EEO_CASE(EEOP_OUTER_FETCHSOME){CheckOpSlotCompatibility(op, outerslot);slot_getsomeattrs(outerslot, op->d.fetch.last_var);EEO_NEXT();}// 宏定义
#define EEO_SWITCH()        starteval: switch ((ExprEvalOp) op->opcode)
#define EEO_CASE(name)        case name:
#define EEO_DISPATCH()        goto starteval
#define EEO_OPCODE(opcode)    (opcode)#endif                            /* EEO_USE_COMPUTED_GOTO */#define EEO_NEXT() \do { \op++; \EEO_DISPATCH(); \} while (0)#define EEO_JUMP(stepno) \do { \op = &state->steps[stepno]; \EEO_DISPATCH(); \} while (0)

也就是日常用的比较少的&&操作符。如下:

#include <stdio.h>                                                                                                                                                          
#include <string.h>enum {ADD,SUB,MUL,DIV,END 
};int main(int argc,char *argv[])
{static const void *const disptab[] = { &&L_ADD,&&L_SUB,&&L_MUL,&&L_DIV,&&L_END};  int code[] = {ADD,ADD,MUL,MUL,END};int i = 0;int sum = 0;goto *disptab[code[i++]];
L_ADD:sum += 2;goto *disptab[code[i++]];
L_SUB:sum -= 2;goto *disptab[code[i++]];
L_MUL:sum *= 2;goto *disptab[code[i++]];
L_DIV:sum /= 2;goto *disptab[code[i++]];
L_END:printf("sum = %d\n",sum);return 0;
}                        

其等价于switch case,如下:

for()
{switch(){case ADD:sum += 2;break;case SUB:sum -= 2;break;case MUL:sum *= 2;break;case DIV:sum /= 2;break;case END:}
}

相比来看,速度会更快。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/68434.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

败者树、置换选择排序、最佳归并树

败者树败者树用一个数组即可实现,而且,上图中的那些方块所代表的结点是不存储在败者树中的置换选择排序 置换选择排序的目的是构造出比工作区更长的初始归并段,而更长就意味着初始归并段会更少,可能会减少归并的趟数,进而减少读写磁盘次数来优化排序时间。 置换选择排序的…

Codeforces Rund 977 div2 个人题解(A~E1)

Codeforces Rund 977 div2 个人题解(A,B,C1,C2,E1) Dashboard - Codeforces Round 977 (Div. 2, based on COMPFEST 16 - Final Round) - Codeforces 火车头 #define _CRT_SECURE_NO_WARNINGS 1​#include <algorithm>#include <array>#include <bitset>#inc…

ide启动多个实例

ide启动多个实例 方法一: ide 2022.X及之后 Run=> Edit Configurations=> 选中项目=> “Build and run”栏=> Modify Options=> 选中“Allow multiple instances”然后就可以run多次项目了 但是要主要改端口 方法二: 先把项目打包,然后启动多个terminal,每个…

周鸿祎:用这10条打造你的完美的商业计划书(附详细讲解)

转载:周鸿祎:用这10条打造你的完美的商业计划书(附详细讲解)_产品 (sohu.com) 江湖上流传着一篇“360大佬周鸿祎版10页商业计划书PPT”,高屋建瓴的讲述了BP制作框架,很有价值。诚然,一个形式上外观精美,具有上有吸引力的BP让人赏心悦目,但更重要的还是有实实在在的内容…

DiLiGenT光度立体数据集

本文对DiLiGenT光度立体数据集进行了详细介绍。简介 ”DiLiGenT“ 光度立体数据集,全称为 calibrated Directional Lightings, objects of General reflectance, and ‘ground Truth’ shapes (normals),即使用标定过的定向光源,对一些具有常见反射率特性的物体进行光度立体…

Pool Kings All In One

Pool Kings All In One 泳池之王 Pool Kings - Mountain Paradise / 泳池之王 - 山间天堂 Utah waterfall MountainPool Kings All In One泳池之王demosPool Kings - Mountain Paradise / 泳池之王 - 山间天堂Utah waterfall Mountainhttps://vimeo.com/233842674 https://www.…

CHT

水电费是否收到fwe】今天探索一下CTH的电脑 PEPPA PIG放映室!tm的图怎么死了

visdom可视化工具

安装visdom可视化工具 pip install visdom -i 作者:太一吾鱼水 宣言:在此记录自己学习过程中的心得体会,同时积累经验,不断提高自己! 声明:博客写的比较乱,主要是自己看的。如果能对别人有帮助当然更好,不喜勿喷! 文章未经说明均属原创,学习笔记可…