免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: jwwzhh

指针的奇怪用法? [复制链接]

论坛徽章:
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
发表于 2012-01-11 17:38 |显示全部楼层
rocklinux 发表于 2012-01-11 17:22
回复 9# zylthinking


我觉得细究这个没意义
古怪的用法也并没有减少CPU周期
就像你叫rocklinux我叫zylthinking一样, 有第三者来研究为什么这样么

论坛徽章:
0
发表于 2012-01-11 18:06 |显示全部楼层
回复 11# zylthinking


哎。。。这不是写法的问题。

我们是觉得这样写有没有其它的原因。比如逼迫编译器类型检查,或者生产不同的代码,像直接写入内存等等。内核中有很多类似的技巧。

论坛徽章:
0
发表于 2012-01-11 18:11 |显示全部楼层
回复 12# rocklinux



简单的说,我们的想知道的,不是在判定这两种方法是等价的情况下,作者为什么选择这种而不选择那种。而是想知道这两种写法到底是不是真的等价。

等价的意思不是说生成的指令一样就叫等价。这个我就不详细解释了,你应该明白。

论坛徽章:
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
发表于 2012-01-11 18:24 |显示全部楼层
等价的意思不是说生成的指令一样就叫等价======我真不懂。。。。。。。。。。。

论坛徽章:
0
发表于 2012-01-11 18:48 |显示全部楼层
(*(struct globals**)&ptr_to_globals) = malloc(sizeof(struct globals));
哪位大仙能解释清楚这种写法的优点,或者说特点?
至于有些人说为什么不写成:
(*(struct globals**)&ptr_to_globals) = (struct globals*)malloc(sizeof(struct globals));
malloc()的返回类型是void *,在linux下编译时,不适用强制类型转换,即添加(struct globals*)也是不会出错的。

论坛徽章:
0
发表于 2012-01-13 10:51 |显示全部楼层
G -- GLOBAL
GLOBAL在syslogd中有自己的定义,记录syslogd运行所需要的一些全局配置信息。
#define G (*ptr_to_globals)
ptr_to_globals在/libbb/messages.c中定义,并在libbb.h中以extern变量的形式导出;
./include/libbb.h:1040:extern struct globals *const ptr_to_globals;
./include/libbb.h:1041:#define PTR_TO_GLOBALS (*(struct globals**)&ptr_to_globals)
./libbb/messages.c:63:struct globals *const ptr_to_globals __attribute__ ((section (".data")));
ptr_to_globals是const类型的变量,不能直接进行赋值,但可以通过指针,间接赋值,在syslogd_main中,使用PTR_TO_GLOBALS宏间接赋值:
PTR_TO_GLOBALS = memcpy(xzalloc(sizeof(G)), &init_data, sizeof(init_data));

论坛徽章:
0
发表于 2012-01-13 10:56 |显示全部楼层
FROM ./docs/keep_data_small.txt:
#define G (*ptr_to_globals)

ptr_to_globals is declared as constant pointer.
This helps gcc understand that it won't change, resulting in noticeably
smaller code. In order to assign it, use PTR_TO_GLOBALS macro:

    PTR_TO_GLOBALS = xzalloc(sizeof(G));

Typically it is done in <applet>_main().

Now you can reference "globals" by G.a, G.buf and so on, in any function.

REF: http://tigcc.ticalc.org/doc/keywords.html#const

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
发表于 2012-01-14 11:27 |显示全部楼层
回复 16# wangjianchangdx

如果确实是定义为:struct globals *ptr_to_globals;
完全没有必要写成:(*(struct globals**)&ptr_to_globals) = malloc(sizeof(struct globals));
直接赋值就可以了:ptr_to_globals = malloc(sizeof(struct globals));

除非ptr_to_globals不是struct globals*类型的,才需要(*(struct globals **)... 将它当作是struct globals*。
果然是因为lz的代码漏掉了重要的信息(比如const)么……


如果使用const是为了让gcc产生好的代码,直接定义为变量而不是指针可行么?
struct globals* const ptr_to_globals; -> struct globals globals;
#define G (*ptr_to_globals) -> #define G globals globals
PTR_TO_GLOBALS = memcpy(xzalloc(sizeof(G)), &init_data, sizeof(init_data)); -> memcpy(&G,&init_data,sizeof init_data);

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
发表于 2012-01-14 12:12 |显示全部楼层
回复 18# OwnWaterloo

不同处在于将数据从静态空间转到堆空间。
是否因为某种原因不能大量使用静态空间? 本来是想问这个的…… 一码起字来就给忘了……

论坛徽章:
0
发表于 2012-01-15 13:11 |显示全部楼层
回复 19# OwnWaterloo

  • busybox中有很多程序,如syslogd, ls, cat等
  • 每个applet可能都需要自己的GLOBAL定义

如果每个applet都声明一个全局或者是static的struct global global,那编译出来的busybox加载运行时将会占用较大的数据区;
每次执行往往只运行一个命令,如ls,那么只需要分配一个ls的GLOBAL即可;

现在的做法有两个优点:
  • 统一GLOBAL使用机制,只需要重新定义GLOBAL,并定义G即可
  • 运行时不需分配较大静态数据区

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP