gsl中的代码重用技术

     在gsl中,由于有float、double、long double多种数据精度,因此如果针对每一种数据精度都分别实现诸如内存分配等函数,代码量将骤增数倍。因此各种数据类型共用这些代码就显得相当重要。gsl利用c语言的预编译命令实现了这种代码的重用功能。

      这里我们以最为基础的gsl_block_alloc函数模板为例,剖析gsl代码重用的原理。

     下面给出该函数的模板源代码

     

    在《gsl数据类型之向量http://blog.csdn.net/insectC/archive/2010/01/27/5262444.aspx》一文中,我们指出对于double精度,函数中宏的值为:

 

      编译后将得到gsl_block_alloc函数,其作用是创建一个包含n个double精度数据的数据块。

      而实际上,这一函数模板同样也可以编译成gsl_block_float_alloc,gsl_block_long_double_alloc等等,分别用于创建float精度与long double精度的向量。

      其中的奥秘就在block/init_source.c与templates_on.h、templates_off.h的互相配合中。让我们来看看block/init.c文件的代码:

 

 

      限于篇幅,其中略去了除float,double外的其他精度类型的代码。

      让我们来跟踪编译过程。首先在定义了BASE_DOUBLE后,编译器将引入templates_on.h。头文件中的关键内容如下:

 

在文件中,ATOMIC被定义为 double,MULTIPLICITY被定义为1。这与前文一致。随后我们又将进一步定义一系列的宏:

 

 

 

 

 

    在这里,FUNCTION(dir,name)宏被定义为CONCAT2(dir,name),而TYPE(dir)宏被定义为dir。

    这样,当我们重新回到init.c并进入view_source.c编译时,便顺理成章的得到了gsl_block_alloc等一系列double精度的函数。

    现在,编译器只剩下一点扫尾工作,即进入templates_off.h文件,关闭已有宏定义,为下一步float精度的编译做好准备。这里节选代码如下:

 

 

     这样double精度的函数编译工作便完成了。按照init.c中的流程,编译器将定义宏BASE_FLOAT,并开始float精度函数的编译。读者可以自己从上面的代码中体会其中的精妙。 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值