精华内容
下载资源
问答
  •  为了提高程序的效率,我们用define来定义一个函数,这样在频繁调用的时候不会有函数调用的开销了,这是宏函数,但宏函数定义只是把S(a,b)简单地替换成a*b,这样会产生问题,典型的两种:  1.缺括号,比如aera=...
  • 2.宏函数普通函数的相同点?不同点?3.宏函数普通函数的优缺点?什么是宏函数?在这之前看一下宏的定义:宏宏是根据一系列预定义的规则替换一定的文本模式。#define BUFFER_SIZE 1024预处理阶段, fun=(char )...

    我们由问题展开:

    1.什么是宏函数?

    2.宏函数与普通函数的相同点?不同点?

    3.宏函数与普通函数的优缺点?

    什么是宏函数?

    在这之前看一下宏的定义:

    宏是根据一系列预定义的规则替换一定的文本模式。

    #define BUFFER_SIZE 1024

    预处理阶段, fun=(char )malloc(BUFFER_SIZE); 会被替换成 fun=(char )malloc(1024);

    #define NUMBERS 1,\
                    2,\
                    3

    预处理阶段int x[]={NUMBERS}; 会被扩展为 int x[]={1,2,3};

    宏函数

    宏名之后带括号的宏被认为是宏函数。

    #define add(a,b) (a+b)

    y=add(1,2); 会被扩展为y=1+2;

    宏函数与普通函数的相同点?不同点?

    相同点:
    若宏是一种替换工具,那么相同点就只有计算结果了。

    不同点:
    宏函数是在预处理阶段进行文本搜索和替换。而普通函数是在编译过程会分配空间,创建栈帧,传参,传返回值等。

    宏函数与普通函数的优缺点?

    宏函数的优点:没有普通函数保存寄存器和参数传递,返回值传递的开销,展开后的代码效率高,速度快。

    缺点:

    1.展开后的代码体积大

    2.宏函数的替换是纯文本替换,C预处理器不对宏做任何语法检查,就像缺个括号等预处理器是不管的

    #define add(a,b) a+b
    int main()
    {
        int t=add(1,2)*2;
        printf("%d",t);
        return 0;
    }

    我们原本是想计算(1+2)* 2的值,但是实际上计算的是1+2 *2的值,所以就出现了计算错误。

    普通函数的优点:

    1.代码体积小

    2.降低程序的复杂性,使程序更容易维护

    缺点:

    程序调用普通函数会开辟一片空间,进行寄存器保存,传值的操作,降低了代码效率

    虽然在代码执行速度上宏函数会更胜一筹,但是《在google编程规范》和《Effective C++》是不推荐使用宏的,因为宏的使用在某种程度上会降低程序的可维护性,还可能会出现一些莫名其妙的错误,而找不到源头。如果对宏的用法不是很熟练,还是避免使用宏定义。

    展开全文
  • 一、定义内联函数区别 1. 定义不是函数,但是使用起来像函数。预处理器用复制代码的方式代替函数的调用,省去了函数压栈退栈过程,提高了效率。  内联函数本质上是一个函数,内联函数一般用于函数体的...

    一、宏定义和内联函数的区别

    1. 宏定义不是函数,但是使用起来像函数。预处理器用复制宏代码的方式代替函数的调用,省去了函数压栈退栈过程,提高了效率。

        内联函数本质上是一个函数,内联函数一般用于函数体的代码比较简单的函数,不能包含复杂的控制语句,while、switch,并且内联函数本身不能直接调用自身。如果内联函数的函数体过大,编译器会自动的把这个内联函数变成普通函数。

     

    2. 宏定义是在预编译的时候把所有的宏名用宏体来替换,简单的说就是字符串替换

        内联函数则是在编译的时候进行代码插入,编译器会在每处调用内联函数的地方直接把内联函数的内容展开,这样可以省去函数的调用的开销,提高效率

     

    3. 宏定义是没有类型检查的,无论对还是错都是直接替换

        内联函数在编译的时候会进行类型的检查,内联函数满足函数的性质,比如有返回值、参数列表等

     

    4. 宏定义和内联函数使用的时候都是进行代码展开。不同的是宏定义是在预编译的时候把所有的宏名替换,内联函数则是在编译阶段把所有调用内联函数的地方把内联函数插入。这样可以省去函数压栈退栈,提高了效率

     

    二、内联函数和普通函数的区别

    1. 内联函数和普通函数的参数传递机制相同,但是编译器会在每处调用内联函数的地方将内联函数内容展开,这样既避免了函数调用的开销又没有宏机制的缺陷

    2. 普通函数在被调用的时候,系统首先要到函数的入口地址去执行函数体,执行完成之后再回到函数调用的地方继续执行,函数始终只有一个复制。

        内联函数不需要寻址,当执行到内联函数的时候,将此函数展开,如果程序中有N次调用了内联函数则会有N次展开函数代码

    3. 内联函数有一定的限制,内联函数体要求代码简单,不能包含复杂的结构控制语句。如果内联函数函数体过于复杂,编译器将自动把内联函数当成普通函数来执行

    转载链接:https://blog.csdn.net/chenguolinblog/article/details/27126589

    展开全文
  • 宏函数、内联函数、普通函数区别刚刚面世完,上来就问宏函数和普通函数区别,整理一下;本文为本人的第一篇博客,各位大虾多多指点 宏函数:在C语言中用的比较多,C++中用的比较少,宏函数只是在预编译阶段做...

    #
    刚刚面世完,上来就问宏函数和普通函数的区别,整理一下;本文为本人的第一篇博客,各位大虾多多指点
    宏函数:在C语言中用的比较多,C++中用的比较少,宏函数只是在预编译阶段做简单的替换,所以不会为函数调用带来额外的开销(不必开辟一段栈空间),没了这种开销,就可以提高代码执行的效率。但是仅仅简单的替换也会带来很多问题。

    #define MAX(a,b) (a) > (b)? (a) :(b)
    int main(void)
     {
        int max=MAX(2,23);//等价于max=a>b?a:b;这条语句
        std::cout << max << std::endl;
        return 0;
     }
     不做函数参数的检查,只做简单的替换也会带来很多问题:
     eg:
     int max=MAX('a',45);//接受的参数不一样编译器也不会报错
                        //等价于a的ASCLL 码和45比较;
    只做简单的替换:
    #include<iostream>
    #define fun(a) a*a*a
     int main(void)
     {
        auto max=fun(5+1);//等价于5+1*5+1*5+1
        std::cout << max << std::endl;
        return 0;
     }
    但这也带来了一个便利:如果比较不同参数的两个值,不用像普通函数那样去重新定义函数的参数
     int max=MAX(34,45);
     int max=MAX23.33,23.98//用同一个宏定义可以满足,不必像普通函数那样定义两个函数

    普通函数:当程序调用普通函数时需要开辟一片栈空间,记录返回地址,将形参压栈,从函数返回还要释放堆栈。这种开销会降低代码效率。

    **内联函数:**C++中内联函数使用相应的函数代码代替函数调用,不需要开辟栈空间,运行速度比常规函数快,但是代价是占用了过多的内存。内联函数需要检查函数的参数是否匹配。
    内联函数的声明用 inline:

    inline int MAX(int a,int b)
    {
        return a>b? a:b;
    } 

    总结:
    宏函数和内联函数与普通的函数相比不用开辟栈空间,都可以提高代码执行的效率,两者都要求函数的代码量较小,但是宏函数只做简单的替换,不检查函数参数类型是否匹配;内联函数匹配函数参数,在函数调用处替换函数的代码。

    展开全文
  • 内联函数、宏和普通函数区别

    千次阅读 2018-08-07 21:48:12
    1、内联函数和宏的区别 定义不是函数,但是使用起来像函数。预处理器用复制代码的方式代替函数的...如果内联函数的函数体过大,编译器会自动的把这个内联函数变成普通函数定义是在预编译的时候把所有的...

    1、内联函数和宏的区别

    • 宏定义不是函数,但是使用起来像函数。预处理器用复制宏代码的方式代替函数的调用,省去了函数压栈退栈过程,提高了效率。
    • 内联函数本质上是一个函数,内联函数一般用于函数体的代码比较简单的函数,不能包含复杂的控制语句,while、switch,并且内联函数本身不能直接调用自身。如果内联函数的函数体过大,编译器会自动的把这个内联函数变成普通函数。
    • 宏定义是在预编译的时候把所有的宏名用宏体来替换,简单的说就是字符串替换
      内联函数则是在编译的时候进行代码插入,编译器会在每处调用内联函数的地方直接把内联函数的内容展开,这样可以省去函数的调用的开销,提高效率
    • 宏定义是没有类型检查的,无论对还是错都是直接替换,
      内联函数在编译的时候会进行类型的检查,内联函数满足函数的性质,比如有返回值、参数列表等
    • 宏定义和内联函数使用的时候都是进行代码展开。不同的是宏定义是在预编译的时候把所有的宏名替换,内联函数则是在编译阶段在所有调用内联函数的地方把内联函数插入。这样可以省去函数压栈退栈,提高了效率

    2、内联函数和普通函数的区别

    • 内联函数和普通函数的参数传递机制相同,但是编译器会在每处调用内联函数的地方将内联函数内容展开,这样既避免了函数调用的开销又没有宏机制的缺陷
    • 普通函数在被调用的时候,系统首先要到函数的入口地址去执行函数体,执行完成之后再回到函数调用的地方继续执行,函数始终只有一个复制。
    • 内联函数不需要寻址,当执行到内联函数的时候,将此函数展开,如果程序中有N次调用了内联函数则会有N次展开函数代码
    • 内联函数有一定的限制,内联函数体要求代码简单,不能包含复杂的结构控制语句。如果内联函数函数体过于复杂,编译器将自动把内联函数当成普通函数来执行
    展开全文
  • 尽管函数式定义和普通函数相比有很多缺点,但只要小心使用还是会显著提高代码的执行效率,毕竟省去了分配释放栈帧、传参、传返回值等一系列工作,因此那些简短并且被频繁调用的函数经常用函数式定义来代替实现...
  • 尽管函数式定义和普通函数相比有很多缺点,但只要小心使用还是会显著提高代码的执行效率,毕竟省去了分配释放栈帧、传参、传返回值等一系列工作,因此那些简短并且被频繁调用的函数经常用函数式定义来代替实现
  • 本篇文章是对、内联函数与普通函数区别进行了详细的分析介绍,需要的朋友参考下
  • 总结一句话:一般情况下,普通函数调用有调用过程的开销,而宏函数是直接替换没有开销,因此效率更高。 函数式宏定义的参数没有类型,预处理器只负责做形式上的替换,而不做参数类型检查,所以危险性高;但因为省...
  • 函数式定义和普通函数区别

    千次阅读 2016-08-29 16:22:47
    在C及C++语言中允许用一个标识符来表示一个字符串,称为,该字符串可以是常数、表达式、格式...若字符串是表达式,我们称之为函数定义。 我们以下面两行代码为例,展开描述: 函数定义:#define MAX(a,b)
  • 比较函数式定义和普通函数区别: 函数式定义:#define MAX(a,b) ((a)>(b)?(a):(b)) 普通函: MAX(a,b) { return a>b?a:b;}   (1)函数式定义的参数没有类型,预处理器只负责做形式上的替换,而不做...
  • 定义函数和普通函数

    千次阅读 2017-06-04 16:21:23
    预处理阶段进行简单的文本替换,没有入栈、出栈、参数传递函数返回等等工作,执行效率明显高于普通函数,因此,简短并且被频繁调用的函数经常用定义函数来代替实现 没有参数检查,会影响程序安全 如果函数比较...
  • 单单从形式看定义的函数和普通函数并无太大的区别,但事实上两者还是有很大不同。 定义函数与普通函数在编译过程上不同。 在编译时,对于定义函数而言,预编译时会将这些定义函数按展开的规则直接展开...
  • 、内联函数和普通函数区别

    千次阅读 2010-11-09 17:15:00
    内联函数的功能预处理的功能相似。相信大家都用过预处理,我们会经常定义一些,如#define TABLE_COMP(x) ((x)>0?(x):0) 就定义了一个。 为什么要使用呢?因为函数的调用必须要将程序执行的顺序转移到...
  • 宏函数和自定义函数的区别

    千次阅读 2017-11-15 17:02:23
     我们把它写成定义函数: #define MAX( a, b) ( (a) > (b) (a) : (b) ) 其次,把它用自定义函数来实现: int max( int a, int b)  {  return (a > b a : b)  } 很显然,我们不会选择用函数来完成这个任务,...
  • 这个问题是面试中经常遇到的,再一次华为的面试中面试官就问道我这个...预处理,这个阶段主要是将定义的符号在源程序中进行替换,比图#define pi 3.1415,这个时期就是将源程序中的所有的pi这样的符号替换为3.1415...
  • 定义函数与普通函数区别

    千次阅读 2017-10-17 23:23:48
    #define MAX(a,b) ((a)>(b)?...所以对上面的定义函数他可以比较不同类型的数据大小,而普通函数则只能比较形参类型的大小。 2)定义函数时一定要注意括号的存在匹配,有时会因为 括号的不存在就会导致
  • 宏函数和函数的区别及其优缺点

    千次阅读 2017-08-11 10:17:09
    定义,编译预处理指令,在编译预处理时即进行简单的字符替换,也只进行简单的字符替换。而定义的函数和用户定义的函数在使用时有什么区别?如下:
  • 宏函数和函数的区别及优缺点

    千次阅读 2017-07-31 16:14:20
    宏函数:#define MAX(a,b) ((a)>(b)?(a):(b)) 普通函数:MAX(a,b) {return a>b?a:b} 1.宏做的是简单的字符串的替换,而函数是参数的传递,参数是有数据类型的。 2.宏的参数替换是直接替换的,不经任何计算,而函数...
  • 一、定义内联函数区别 1. 定义不是函数,但是使用起来像函数。预处理器用复制代码的方式代替函数的调用,省去了函数压栈退栈过程,提高了效率。  内联函数本质上是一个函数,内联函数一般用于函数...
  • inline ,static ,普通函数区别

    千次阅读 2018-03-19 20:40:27
    内联函数与区别 内联函数与普通函数区别
  • 详细罗列出定义和函数调用的区别,很全。。。
  • 内联函数与宏函数区别

    千次阅读 2018-08-07 22:04:20
    以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率 特性 inline是一种以空间换时间的做法,省去调用函数额开销。所以代码很...
  • 问:内联函数、静态函数和普通函数之间的区别?答:1.内联函数和普通函数最大的区别在于内部的实现方面,当普通函数在被调用时,系统首先跳跃到该函数的入口地址,执行函数体,执行完成后,再返回到函数调用的地方,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 75,910
精华内容 30,364
关键字:

宏函数和普通函数的区别