c语言内联函数定义绝对值,[讨论]FAQ新增条目建议 内联函数有关知识

内联函数是C/C++中的一种优化手段,类似于宏定义但更安全。它们可以提高性能,避免函数调用开销,但过度使用可能导致代码膨胀。内联函数在类成员中使用可以实现安全的封装,并且其参数类型由编译器检查,避免了宏定义的潜在错误。正确声明和定义内联函数,包括非成员函数和成员函数,需要注意将定义放入头文件中,以确保链接器能识别。虽然内联函数可以提升效率,但并不总是带来性能提升,需要权衡使用。
摘要由CSDN通过智能技术生成

[讨论]FAQ新增条目建议 内联函数有关知识

[9.1] 内联函数是干嘛的?

内联函数是将被插入到调用者代码流中的函数,就像一个#define的宏一样,内联函数通过避免调用自己和(特别是)通过编译在调用过程中优化调用过程(过程整合)来达到提升性能的效果.

[9.2] 内联函数是如果保证安全和速度的平衡性的?

在C中,你可以通过在结构体里面放置一个void*来达到"封装的结构体",这种情况下,void*指向结构体中用户不知道的实际数据。这样结构体的用户就不知道如何解释用void*指向的内容,但是访问这些函数的时候就会从void*型自动转换为相应的合适的类型。这就给出了一种形式的封装。

不幸的是它失去了类型的安全性,它也在强制函数调用的时候要访问结构体中每个角落的数据(如果你允许对结构体进行直接的访问的话,任何人都可以访问它们,因为他们有必要知道他们如何解析用void*指向的东西,这个会让改变数据结构的时候变得更加困难了.

C++类允许函数调用扩展内联.这就可以让你安全地进行封装,而且保证了快速的直接的访问.此外,这些内联函数的参数类型是由编译器来进行检查的,这是对于C中的#define宏的一个改进.

[9.3] 我为什么要用内联函数呢?而不是用原来好好的#define宏?

因为#define宏在四个方面是非常糟糕的(这里的内容没有找到,比较遗憾)

不像#define宏,内联函数可以避免声名狼籍的宏错误因为内联函数总是对每个参数精确匹配一次。换言之,调用内联函数在语义上只是像调用了一个正则表达式,只是要更快一些:

//一个返回i绝对值的宏

#define unsafe(i) ( (i) >=0 ? (i) : -(i) )

//一个返回i的绝对值的内联函数

inline int safe(int i)

{

return i>=0?i:-i;

}

int f();

void userCode(int x)

{

int ans;

ans=unsafe(x++);

ans=unsafe(f());

ans=safe(x++);

ans=safe(f());

}

与宏不一样的是,参数的类型是会被检查的,不必要的会话会被正确的处理。

宏对你的程序的健康是不利的,除非不得以,否则不要用它们!

[9.4] 你怎么让编译器识别一个非成员函数的内联函数?

当你申明一个内联函数的时候,它看起来就像是一个普通的函数:

void f(int i,char c)

但是当你定义一个内联的函数,你把函数的定义加上inline关键字,当你所以下的定义放入头文件之后:

inline

void f(int i,char c)

{

//...

}

注意:把一个函数的定义放到一个头文件里面是一个规则性的东西。除非函数只是在一个单独的cpp文件中调用到了。特别的,如果你把内联函数放在一个cpp文件里面,而你从其他的cpp文件里面调用它,你会在连接器得到一个"unresolved external"错误。

[9.5] 你怎么让编译器识别一个内联的成员函数?

当你定义一个成员函数的时候,它看起来就像是一个普通的成员函数:

class Fred {

public:

void f(int i,char c);

};

但是如果你定义一个内联的成员函数的时候,你就得在函数定义前使用inline关键字,并且把这个定义放到一个头文件中,

inlune

void Fred::f(int i,char c)

{

//...

}

注意:把一个函数的定义放到一个头文件里面是一个规则性的东西。除非函数只是在一个单独的cpp文件中调用到了。特别的,如果你把内联函数放在一个cpp文件里面,而你从其他的cpp文件里面调用它,你会在连接器得到一个"unresolved external"错误。

[9.6] 是不是有另外一种方法让编译器识别到一个内联的成员函数?

是的!在类体内定义一个成员函数的时候就相当于把它申明为一个内联函数:

class Fred {

public:

void f(int i,char c)

{

//...

}

};

尽管这对于写这个类的人来说更加简单一些,但是这个对于所有的阅读者来说就变得更加困难了,因为它混了什么是一个类与这个类怎么实现它两个问题。因为这个混淆的存在,我们通常用inline关键字在类的外面定义成员函数。这个认识就有以下的意义了:在一个面向代码重用的世界里,有很多人会使用你的类,但是只有一个人来编写它(你自己),这样你就应该做一些能让更多的人受益的事,而不让极少数人受益.

[9.7] 内联函数会一定让你的程序性能更好吗?

不是的。

注意内联函数的过度应用会造成代码的膨肿,这个会让分页平台环境的性能降低。

[此贴子已经被百年不亮于2007-9-21 23:08:19编辑过]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,内联函数和宏定义都是用来提高程序的执行效率的方式,但它们之间有一些区别。 首先,内联函数是在函数调用时将函数体直接复制到调用处,而不是通过函数调用来执行代码。这样可以节省了函数调用的开销,提高了程序的运行速度。内联函数需要使用`inline`关键字来声明,并且适用于函数体较小的情况。内联函数有以下特点:只能在函数定义时使用`inline`关键字声明;内联函数定义通常放在头文件中;对于大型的、递归的或包含循环的函数不宜使用内联函数。 其次,宏定义是一种文本替换的机制,通过在代码中定义宏,在程序编译前将宏名称替换为对应的宏内容。宏定义使用`#define`指令来定义,在宏替换时没有函数调用的开销,因此宏定义可以加速程序的执行。宏定义有以下特点:可以在任何地方进行定义和使用;使用宏定义时进行的是文本替换,不会创建函数的副本;替换时可能存在隐藏的错误。 总结起来,内联函数和宏定义在提高程序执行效率方面有相似的作用,但内联函数通常比宏定义更安全可靠。由于内联函数是使用函数调用方式执行代码,因此可以进行类型检查和其他编译期间的优化,而宏定义只是进行文本替换,所以容易出现一些潜在的错误。根据具体的代码需求和效率要求,选择使用内联函数或宏定义更加合适。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值