云服务器

Ceph源码之 common/config.*

2017-12-14 12:05:17 0

今天在研究ceph时,看到一个初始化成员变量的技巧。

如果一个class中有成百上千个成员变量,有没有觉得当写类头文件都写到手痛,还要在构造函数里初始化它们,简直不敢再想下去了。

像下图这样,这只是头文件:

还有实现的:

接着还有get 和 set :

以上是最笨的方法。

那么ceph的开发者是怎样做的呢。他们利用c++的宏,在class的头文件定义成员变量前定义好要用的宏,如下

OPTION(name,ty,init)宏能根据ty,也就是成员变量的类型,在编译时生成成员变量,成员变量的最终定义是在common/config_opts.h下:

Class的构造函数初始化成员变量也是一样的手法:

只要改动common/config_opts.h下的OPTION语句就能实现增删成员变量了。

至于get 和 set 方法,用了一个巧妙的方法:直接对成员变量相对该class的偏移地址进行存取。以下为例,如下图:

初始化全局数组config_optionsp时,每个config_option元素记录着md_config_t里的一个成员变量的名字,类型和偏移,如上图中的编号4小图。主要用的是stddef.h里的offsetof计算成员变量在class里的偏移值。

当调用get时进入到上图中小图1的函数,先找根据成员变量的名字找出config_option对象,再如小图2调用config_option的conf_ptr(小图3),其中md_conf_off是该成员变量在md_config_t类中的偏移量。这样就能直接存取成员变量,而且运行效率更高,同时又降低了开发的工作量,代码也更美观!

上一篇: 无

微信关注

获取更多技术咨询