`
totoxian
  • 浏览: 1074234 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

关于inline函数

阅读更多

(一)inline函数(摘自C++ Primer的第三版)

在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联。

inline int min(int first, int secend) {/****/};

inline函数对编译器而言必须是可见的,以便它能够在调用点内展开该函数。与非inline函数不同的是,inline函数必须在调用该函数的每个文本文件中定义。当然,对于同一程序的不同文件,如果inline函数出现的话,其定义必须相同。对于由两个文件compute.C和draw.C构成的程序来说,程序员不能定义这样的min()函数,它在compute.C中指一件事情,而在draw.C中指另外一件事情。如果两个定义不相同,程序将会有未定义的行为.

为保证不会发生这样的事情,建议把inline函数的定义放到头文件中。在每个调用该inline函数的文件中包含该头文件。这种方法保证对每个inline函数只有一个定义,且程序员无需复制代码,并且不可能在程序的生命期中引起无意的不匹配的事情。

(二)内联函数的编程风格(摘自高质量C++/C 编程指南)

关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用

如下风格的函数Foo 不能成为内联函数:
inline void Foo(int x, int y); // inline 仅与函数声明放在一起
void Foo(int x, int y)
{
}
而如下风格的函数Foo 则成为内联函数:
void Foo(int x, int y);
inline void Foo(int x, int y) // inline 与函数定义体放在一起
{
}
所以说,inline 是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。一般地,用户可以阅读函数的声明,但是看不到函数的定义。尽管在大多数教科书中内联函数的声明、定义体前面都加了inline 关键字,但我认为inline 不应该出现在函数的声明中。这个细节虽然不会影响函数的功能,但是体现了高质量C++/C 程序设计风格的一个基本原则:声明与定义不可混为一谈,用户没有必要、也不应该知道函数是否需要内联。


定义在类声明之中的成员函数将自动地成为内联函数,例如
class A
{
public:
void Foo(int x, int y) { } // 自动地成为内联函数
}
将成员函数的定义体放在类声明之中虽然能带来书写上的方便,但不是一种良好的编程
风格,上例应该改成:
// 头文件
class A
{
public:
void Foo(int x, int y);
}
// 定义文件
inline void A::Foo(int x, int y)
{
}

慎用内联
内联能提高函数的执行效率,为什么不把所有的函数都定义成内联函数?
如果所有的函数都是内联函数,还用得着“内联”这个关键字吗?
内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的
执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收
获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,
消耗更多的内存空间。以下情况不宜使用内联:
(1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
(2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。
类的构造函数和析构函数容易让人误解成使用内联更有效。要当心构造函数和析构
函数可能会隐藏一些行为,如“偷偷地”执行了基类或成员对象的构造函数和析构函数。
所以不要随便地将构造函数和析构函数的定义体放在类声明中。
一个好的编译器将会根据函数的定义体,自动地取消不值得的内联(这进一步说明
了inline 不应该出现在函数的声明中)。

分享到:
评论

相关推荐

    inline-in-iar_c.rar_iar inline 函数_iar 内联函数_msp430f4152

    在IAR C中,内联函数的定义通常使用关键字`inline`。下面我们将深入探讨如何在IAR C中使用内联函数以及它们与MSP430F4152微控制器的结合。 首先,让我们看看如何定义一个内联函数。在C语言中,内联函数的定义方式...

    inline函数说明(转载)

    ### inline函数:优化与陷阱 在C++编程中,`inline`关键字的使用是一个重要的优化技术,它旨在减少函数调用的开销,提高代码执行效率。本文将深入探讨`inline`函数的工作原理、使用场景及其潜在的陷阱,帮助开发者...

    内联函数inline使用实例

    内联函数(inline)在C++...以上就是关于内联函数`inline`在C++中的使用实例和相关知识点的详细说明,希望能帮助你理解和应用这一技术。在实际编程中,应结合具体需求和编译器特性,灵活运用内联函数来提升程序性能。

    每天学点C++(C++实例教程:教程+源码)inline函数.zip

    2. **使用inline函数的优势**: - 提升性能:由于消除了函数调用的开销,内联函数通常比常规函数更快。 - 避免栈帧分配和恢复:函数调用通常会涉及栈帧的创建和销毁,内联避免了这些操作。 - 更少的间接跳转:...

    52_虚函数可以声明为inline吗1

    在C++编程语言中,内联函数(inline)和虚函数(virtual)是两种非常重要的特性,它们分别用于优化性能和实现多态性。然而,它们的性质和使用场景是不同的,这导致了某些限制,比如虚函数通常不建议声明为内联。下面...

    C++中inline函数详解

    C++中的inline函数是一种特殊的函数,其主要目的是提高程序的执行效率。内联函数的定义是在函数声明或定义时在其返回类型前加上`inline`关键字。这样做的目的是告诉编译器,希望它在可能的情况下在调用点直接展开...

    APIHook、InlineHook库,使用C++11编写,可将回调函数绑定到类成员函数

    在本库中,`corehook.hpp`可能包含了APIHook的核心实现,`opcode.hpp`可能涉及到了汇编级别的操作,而`corefunctor.hpp`可能是关于如何处理回调函数的封装,尤其是与类成员函数绑定的部分。 在`detail`目录下,通常...

    完美支持64&32位InlineHook,C语言,C++类 都有

    Inline Hook是一种技术,它允许你修改程序中的函数调用,以在不替换原函数的情况下,在其内部注入自定义的行为。这种技术在系统监控、调试、性能优化和恶意软件中都有广泛应用。本文将深入探讨64位和32位环境下如何...

    apihook,inlinehook

    以下是关于apihook和inlinehook的一些详细知识点: 1. **API Hook的工作原理**:API Hook通常涉及创建一个替代函数(也称为钩子函数),该函数会在原API函数之前或之后执行。这可以通过替换函数指针、使用钩子库或...

    C语言的inline内联函数的作用

    通过使用`inline`关键字,程序员向编译器发出请求,希望在编译时将函数体插入到每个调用该函数的地方,而不是在运行时通过函数调用来执行。这种做法可以消除函数调用时的开销,比如保存和恢复寄存器状态、压栈和出栈...

    pub类库

    关于inline函数 我写的这些类的函数,大部分是可以写成inline函数的,对性能提高也有很大的帮助。但是,GCC和VC的不同版本编译器的支持程度不同,可能会编译不过,所以就都没有为提高效率而写inline函数。依赖于...

    详解恢复Inline Hook源码

    它通常用于性能敏感的场景,因为inline函数可以消除函数调用的开销。然而,Inline Hook也会带来问题,比如当程序被Hook后,原始函数的行为可能会丢失,因此恢复Inline Hook显得至关重要。 首先,我们要理解Inline ...

    WINAPI调用约定函数的inlineHOOK模板类(class)

    使用class封装的inlineHOOK模板类(class),可劫持大部分WINAPI函数,此种函数的特征为前5字节为 8B FF 55 8B EC;和使用此模板类的几个示例。 如果劫持关键DLL中的函数,请注意DEP的状态:AlwaysOff或者自己实现过...

    API hook(inline)超简入门代码

    Inline Hook是最简单也是最直接的一种方式,它直接修改目标函数的机器码,使其跳转到我们定义的新函数(钩子函数)。 首先,我们需要了解如何找到要hook的目标函数的地址。在Windows API中,MessageBoxW函数是显示...

    C语言的inline.pdf

    1. `static inline`:这种形式的inline函数类似于一个具有inline属性的静态(static)函数。这意味着函数的作用域限制在定义它的源文件内部,可以避免链接时的重复定义问题。在大多数情况下,GCC会在函数调用处进行...

    2021-2022计算机二级等级考试试题及答案No.4068.docx

    1. 关于 inline 函数:inline 用于优化程序,适合定义代码短小且频繁调用的函数,以减少函数调用的开销。C 选项正确。 2. 计算机运算速度的单位:MIPS(Million Instructions Per Second)是衡量CPU性能的常用单位...

    一个简单的inline hook

    ** inline hook 简介** Inline hook是一种在编程中用于拦截和...以上就是关于"一个简单的inline hook"的相关知识,包括其原理和实现方法。对于新手来说,理解并实践这些概念是深入学习逆向工程和软件调试的重要步骤。

    VC inline hook实例

    inline hook的基本思想是在目标函数的入口处插入一段自定义代码(通常是跳转指令),使得原本的函数调用被重定向到我们自定义的处理函数。当处理完毕后,再跳回原始函数的真正入口,完成对原函数的"挂钩"。 ### 2. ...

    关于c语言函数大全总结

    - 使用`inline`关键字可以请求编译器尝试内联函数,提高程序性能。但编译器是否接受取决于优化设置。 11. **变参数函数**: - 使用`...`(省略号)表示可变数量的参数,如`printf()`。需要配合`stdarg.h`头文件来...

Global site tag (gtag.js) - Google Analytics