zoukankan      html  css  js  c++  java
  • 内联函数和宏定义的区别和联系

      深入到计算机的本质,其实,很多东西还是细节需要深入分析的,比如我最近的一份工作

      内联函数和宏很类似,都是以空间换时间,都能一定程度上加快程序的执行。而区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。当然,内联函数也有一定的局限性。就是函数中的执行代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。这样,内联函数就和普通函数执行效率一样了。

    简而言之,两者的区别如下:

    1.宏定义是在预处理阶段由预处理器替换,内联函数是在编译时编译器执行。

    2.内联函数还是有函数的特性,而宏定义真的只是简单的字符串替换,容易出现一些问题。

     下面给出一份测试他们速度的代码:

    #include <stdio.h>
    #include <time.h>
    
    #define NUM(x) x*x*x
    
    static inline int num_test(int x)
    {
        return x*x*x;
    }
    
    static int array[32];
    int main()
    {
        int test = 0xEFFFFFFF;
        int cnt = 0;
        long long num = 0,num1 = 0;
        clock_t start, finish;
        double duration;  
    
        start = clock(); 
        while(cnt++ < 10000)
        {   
            num += NUM(cnt);        
            
        }   
        finish = clock(); 
    
        duration = (double)(finish - start) / CLOCKS_PER_SEC;  
        printf( "%f seconds 
    	", 1000*duration );  
    
        cnt = 0;
        start = 0, finish = 0;
    
        start = clock(); 
        while(cnt++ < 10000)
        {   
            num1 += num_test(cnt);
        }   
    
        finish = clock(); 
    
        duration = (double)(finish - start) / CLOCKS_PER_SEC;  
        printf( "%f ms seconds 
    	", 1000*duration );  
    
        printf("num:%d num1:%d 
    	",num, num1);
    
        return 0;
    }

      具体的运算时间就需要你自己运行一下了,笔者只是知道,这个速度是几乎没什么差别的,就看你怎么用了,什么具体的场景使用什么了。

  • 相关阅读:
    iOS开发-UIColor和UIImage之间的转换
    iOS开发-给用户好的印象
    iOS开发之国际化(本地化)
    git学习之创建分支和合并分支
    iOS设置StatusBar字体颜色问题
    iOS开发技巧,细节(二)
    iOS开发,[NSBundle mainBundle] pathForResource方法返回空的问题解决
    【MM MRP】PA-SCM525 Unit2 Lot-Size$Rounding Profile(MRP_2)
    【MM MRP】PA-I (MRP_1)
    【MM 发票】MM MIRO界面中的ITEM LIST的布局可自己定义(转)
  • 原文地址:https://www.cnblogs.com/dylancao/p/10260862.html
Copyright © 2011-2022 走看看