美文网首页
c++ 内联函数

c++ 内联函数

作者: codeflame | 来源:发表于2018-08-21 17:25 被阅读0次

使用关键字inline来定义,把函数调用处直接进行代码替换。
实际上是否进行代码替换由编译器进行最终决定。此外内联函数被本身所在cpp文件中调用时,才会有如同普通函数一样的地址,具体影响看下面例子。


内联函数的定义问题

1.编译器编译时以cpp为一个编译单元,别的cpp编译完就彻底过去了,对当前编译cpp不造成影响。所以,只有内联函数的定义对编译器编译可见时,才能以代码替换形式实现真正的内联函数。

2.仅在A.cpp定义内联函数,B.cpp声明了该函数,但在B中仍然是不可用,出错的。
在A.cpp和B.cpp中定义一样的内联函数,不会造成重定义。

3.奇异效果:
为减少烦躁心理,以下示例cpp代码中略去#include "stdafx.h"、#include <iostream>、using namespace std;

A.cpp:
inline void m()
{
    cout << "A";
}
Main.cpp:
extern void m();
int main()
{
    m();
    return 0;
}

这样将会报错无法解析的外部符号。
但是,把A.cpp添加修改如下

A.cpp:
inline void m()
{
    cout << "A";
}
void ma()
{
    m();
}

这样又是可以通过编译的,能正确输出。
前者是编译完后,内联函数没有函数地址,链接时自然找不到。后者新增ma()中调用了m(),使得编译A.cpp时让m有了函数地址(这时编辑器特意拿个特殊小本子记住:这个m()对应这个函数入口地址。不同编译器可能处理不同),连接时m()便是对各cpp可见了。

4.奇异效果x2:
类似A.cpp,写多两个:B.cpp、C.cpp

B.cpp:
inline void m()
{
    cout << "B";
}
void mb()
{
    m();
}
C.cpp:你懂的。。。

这样仍然能通过编译,编译全部cpp后,函数m()也就有3个函数地址,最后由编译器自行决定留哪一个,丢弃另外两个地址。所以,最后Main.cpp的调用输出可能是"A"、"B"、"C"中的任意一个,ma()、mb()、mc()的结果也是同理。

5.类也是一样的情况
头文件中写类,弄两个cpp分别用inline定义成员函数,然后分别写个函数调用成员函数使得成员函数有入口地址,最后在main函数中调用该成员函数时,最终结果也是编译器自主决定是哪个入口地址的。

6.总结
对于同名函数定义在不同cpp内的情况:
只用inline没有内部调用,其他cpp会外部符号无法解析(找不到定义)。错误!
只用inline且被内部调用,编译器只保留1个函数地址,结果不定但不会重定义。可以!
inline被内部调用后如同普通函数,会与不使用inline定义的普通函数产生重定义冲突。

相关文章

  • 宏定义min

    C++内联函数

  • 白话kotlin:内联函数助你提升运行效率

    什么是内联函数 这个玩意吸取自C++,如下: 内联函数是C++的增强特性之一,用来降低程序的运行时间。当内联函数收...

  • 《C++ Primer Plus》:函数探幽

    本章内容概览 内联函数 引用变量 按引用传递函数参数 默认参数 函数重载 函数模板 内联函数 内联函数是C++为提...

  • 第九章 内联函数

    简介:C++中预处理器宏存在的问题,在C++中如何用内联函数解决这些问题以及使用内联函数的方针和内联函数的工作机制...

  • C++基础-(函数)

    C++基础 函数 内联函数 内联函数非常短的函数适合于内联函数体会到插入到发生函数调用的地方普通函数调用多次也只有...

  • C++内联函数与C语言函数宏

    C++内联函数 什么是内联函数? 在函数的声明和定义前加一个 inline 关键字,这个函数就是内联函数。 通常会...

  • Kotlin 内联函数 inline

    Kotlin 中新增了「内联函数」,内联函数起初是在 C++ 里面的。 那在 Kotlin 中加入内联函数,是有什...

  • ★ 学习笔记:《iOS高级:Swift入门精讲②》第一节 Swi

    前言:本篇仅为视频学习笔记 内联函数 (Inline Function)内联函数在C++这个函数里是有的,那么在s...

  • C++ 的inline关键字

    首先理解内联函数: ​ C++ 内联函数是通常与类一起使用。如果一个函数是内联的,那么在编译时,编译器...

  • C++内联函数inline

    C++内联函数inlineC++ 内联函数是通常与类一起使用。如果一个函数是内联的,那么在编译时,编译器会把该函数...

网友评论

      本文标题:c++ 内联函数

      本文链接:https://www.haomeiwen.com/subject/oldjiftx.html