免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 15691 | 回复: 21

[C++] 做了个玩具 [复制链接]

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
发表于 2018-01-21 19:15 |显示全部楼层

  1. #include <setjmp.h>
  2. #include <stdio.h>

  3. struct defer_t {
  4.     jmp_buf env1;
  5.     jmp_buf env2;
  6.     long rsp;

  7.     ~defer_t() {
  8.         int n = setjmp(env2);
  9.         asm("mov %%rsp, %0\n" :"=m"(rsp) ::);
  10.         //printf("save rsp %p %p %p\n", (void *) rsp, this, __builtin_return_address(0));

  11.         if (n == 0) {
  12.             longjmp(env1, 1);
  13.         }
  14.     }
  15. };

  16. #define defer2(l, ...) \
  17. ({ \
  18.     defer_t* np = &defer_node_##l; \
  19.     if (1 == setjmp(np->env1)) { \
  20.         __asm__ __volatile ("mov %0, %%rsp\n" : :"m"(np->rsp) :"rsp"); \
  21.         __VA_ARGS__; \
  22.         longjmp(np->env2, 1); \
  23.     } \
  24.     np; \
  25. })
  26. #define defer1(l, ...) defer_t defer_node_##l, *dn_ptr_##l = defer2(l, ##__VA_ARGS__)
  27. #define defer(...) defer1(__line__, ##__VA_ARGS__)

  28. int tests()
  29. {
  30.     struct a{
  31.         ~a() {
  32.             printf("hello world\n");
  33.         }
  34.     };

  35.     int var = 9;
  36.     if (var == 9) {
  37.         puts("normal 1");
  38.         defer(delete (new a));
  39.     }

  40.     defer(printf("deffered %d\n", var));
  41.     puts("normal 2");
  42.     return 0;
  43. }

  44. int main()
  45. {
  46.     tests();
  47.     puts("sss\n");
  48.     return 0;
  49. }
复制代码

clang 可以看起来正常运行, gcc 不带 -O 编译可以运行, 其他的失败




论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2018-01-23 15:43 |显示全部楼层
用go就行了,还折腾回来干嘛

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2018-01-23 15:44 |显示全部楼层
c++一个类析构+闭包不也一样

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
发表于 2018-01-23 18:01 |显示全部楼层
本帖最后由 zylthinking 于 2018-01-23 18:03 编辑

回复 3# cokeboL

lamda 写起来不自然, 而且
能这样?      

defer(delete (new a))

我的里面不是函数调用, 是语句

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2018-01-23 22:26 |显示全部楼层
回复 4# zylthinking

再怎么着,也不如go自然,直接写go好不好?

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
发表于 2018-01-23 23:34 |显示全部楼层
本帖最后由 zylthinking 于 2018-01-23 23:56 编辑

回复 5# cokeboL

我知道你转go了, 我没说go不好, 但你也不要随时随地go万岁行不行
go 也就是一个m:n线程库 + 变量生存期自动化 + 垃圾收集器 三方面内容; 反射性能低, cgo性能低; 因为它是m:n的, 除了能够像协程那样 switch to + 可以轻易创建大量的 go程而不明显拖累性能, 以及只要不调用标准库函数, 那么大概率不会被其他go程抢占外(说是大概率, 是因为我也不确定go编译器会不会偷偷摸摸在代码中插入时间相关的go程切换代码, 反正fmt.Printf 中肯定存在时间片耗尽被切换走类似的逻辑), 其他的和线程没分别, 该上的锁一个也漏不掉。

话说一次面试时让用一读一写两个go程来读写链表, 面试官失望的说我写的和线程没区别, 我就郁闷了, M:N 下可不你还真没办法写的有区别。
重要的是, 库现在还幼稚的很; 你找一个 gmime 类似的邮件解析库给我看看先

golang 的 defer 语法形式也就一般般, 我模拟它不是羡慕它, 只是想看看到底能不能实现。
再说, 你golang 能 defer close(file);  就自然, 我 defer(close(file)) 就不自然?
我不就你比多一个括号吗?

我还能
int i = 9;
defer (i = 10);


你golang 怎么写?
i := 9;
defer func() {i = 10} ()?

谁不自然?


golang 循环中的 defer 是大忌吧
我的没事

要说我的哪里不好, 就是严重依赖编译器的实现, 目前观察下来, gcc -O优化会挂,  clang没事 gcc 不带 O 也没事; 另外clang 也不保险
但我都说这是玩具了, 就是弄着玩的;
假设编译器给力, 我的语法形式怎么也不会比 golang难看
何况, 我使用了 不到 40行代码模拟出了 golang 在编译器帮助下才实现的 defer 语义, 难道你就不表示佩服





论坛徽章:
12
2015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之同曦
日期:2017-03-17 19:13:162016科比退役纪念章
日期:2016-11-07 08:28:12luobin
日期:2016-06-17 17:46:36wusuopu
日期:2016-06-17 17:43:4515-16赛季CBA联赛之福建
日期:2016-01-14 12:49:22程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:002015年亚洲杯之科威特
日期:2015-03-24 14:21:272015年迎新春徽章
日期:2015-03-04 09:57:092016科比退役纪念章
日期:2018-04-10 16:20:18
发表于 2018-01-24 09:01 |显示全部楼层
表示佩服

论坛徽章:
3
巳蛇
日期:2013-10-03 10:41:48申猴
日期:2014-07-29 16:12:04天蝎座
日期:2014-08-21 09:24:52
发表于 2018-01-24 10:36 |显示全部楼层
说真的,看不懂。。。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2018-01-24 11:57 |显示全部楼层
回复 6# zylthinking

好的,我欠状元郎一个佩服,这里补上:五体投地,十分佩服!


到处go万岁也是为了用的人更多,圈子更强大,然后跟着享福
说不自然只是为了忽悠大家在非极端领域(比如嵌入式等硬件资源受限或者要求极致性能的场景),尽量别再c/c++了,真的好累心

“反射性能低, cgo性能低”
本来就不鼓励用这些东西,何苦纠结它,而且反射有些地方没办法比如用到json的,cgo如果不是必须依赖c库比如oracle,也别用就好了

“因为它是m:n的, 除了能够像协程那样 switch to + 可以轻易创建大量的 go程而不明显拖累性能, 以及只要不调用标准库函数, 那么大概率不会被其他go程抢占外(说是大概率, 是因为我也不确定go编译器会不会偷偷摸摸在代码中插入时间相关的go程切换代码, 反正fmt.Printf 中肯定存在时间片耗尽被切换走类似的逻辑), 其他的和线程没分别, 该上的锁一个也漏不掉。”
我觉得协程最大的好处是在大部分场景可以愉快地写同步代码,从callback hell中解放出来,锁,函数式编程或者单线程逻辑才可以避免可是这两种模型更2b
go提供简单特性和通用的编程模型,工程性要强得多

“话说一次面试时让用一读一写两个go程来读写链表, 面试官失望的说我写的和线程没区别”
不知道为啥会有那么多如此的面试官,我总是看不懂很多这种问题,面试官到底想问啥,他想实现的需求我都搞不懂
每次看到这种问题,我都觉得,它们(它在语文里指代禽兽)要么是为了装逼但自己语文都没学好,要么就是故意刁难人压工资

“重要的是, 库现在还幼稚的很; 你找一个 gmime 类似的邮件解析库给我看看先”
又不是每个人都写邮件相关,其他很多强大的库,至少比c/c++方便的多

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2018-01-24 11:58 |显示全部楼层
去年写了好多nodejs,蛋疼,工程性比go差多了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP