首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

编译器决定不内联一个函数会导致多个定义吗?

编译器决定不内联一个函数不会导致多个定义。当编译器决定不内联一个函数时,它会生成函数的单个定义,并在需要调用该函数的地方插入对该定义的引用。这样可以避免在编译过程中出现多个函数定义的问题。

函数内联是一种编译器优化技术,它将函数调用处直接替换为函数体,减少了函数调用的开销,提高了程序的执行效率。然而,并非所有函数都适合内联,编译器会根据一些规则和策略来决定是否进行内联。例如,函数体过大、递归调用、函数指针等情况都可能导致编译器不内联函数。

对于不适合内联的函数,编译器会生成函数的单个定义,并在需要调用该函数的地方插入对该定义的引用。这样可以确保在链接阶段不会出现多个函数定义的冲突。

总结起来,编译器决定不内联一个函数不会导致多个定义,它会生成函数的单个定义,并在需要调用该函数的地方插入对该定义的引用。这样可以保证程序的正确链接和执行。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

开启C++之旅(下):引用、内联函数及现代特性(auto和范围for循环)

3.没有类型安全的检查 为了解决缺点,c++中采用: 常量定义 换用const enum 短小函数定义 换用内联函数 2.1内联函数概念 以inline修饰的函数叫做内联函数,编译时C...,如果编译器函数当成内联函数处理,在编译阶段,会用函数体替换函数调用。...inline对于编译器而言只是一个建议(会不会真的使用,看编译器自己决定)不同编译器关于inline实现机制可能不同,一般情况:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)...、不是递归、且频繁调用的函数采用inline修饰,否则编译器忽略inline特性 inline建议声明和定义分离,分离导致链接错误。...当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量 3.3auto不能使用的场景 auto不能作为函数的参数

22510

【C++】内联函数 ③ ( C++ 编译器 不一定允许内联函数内联请求 | 内联函数的优缺点 | 内联函数 与 宏代码片段对比 )

避免不必要的 开销 和 代码膨胀 ; 2、C++ 编译器 不一定允许内联函数内联请求 由于 " 内联函数 " 导致不必要的 开销 和 代码膨胀 , 因此 , C++ 编译器并不一定保证内联请求的成功...; 内联函数 优点 是 可以减少函数调用的开销,提高程序的执行效率 ; 内联函数 缺点 是 增加代码的大小 , 降低程序的性能 ; 因此,编译器决定 " 内联函数 " 是否 内联时 , 进行权衡...内联带来的性能提升 和 代码大小增加的开销 ; 3、是否内联决定权在编译器手中 是否内联决定权在编译器手中 : 在 C++ 语言中,inline关键字只是对编译器的建议,编译器可以根据自己的 优化策略...自由决定是否内联函数 ; 在 普通函数 声明和定义 位置 前面加上 inline 关键字 , 只是 建议 C++ 编译器将该函数内联 , 并不强制要求编译器内联函数 , 如果编译器决定内联函数 ,...该 内联函数 作用 等同于 普通函数 ; 最终 内联函数 是否内联成功 , 由 编译器 决定 ; 二、内联函数 与 宏代码片段对比 1、内联函数 " 内联函数 " 的 本质是 函数 , 其是一种 特殊的函数

20320
  • 【C++】内联函数&auto&范围for循环&nullptr

    不是说内联函数会展开建立函数的栈帧,这里为什么建立❓ 这是因为在Debug版本下内联函数是不会展开的(因为在Debug版本下我们可以进行调试) 查看方式: 在release模式下,查看编译器生成的汇编代码中是否存在...inline对于编译器而言只是一个建议,编译器自动优化,如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联。 inline建议声明和定义分离,分离导致链接错误。...这里有一个问题❓为什么函数长了以后展开——代码膨胀 编译好的指令影响的是可执行程序(安装包)的大小 对于第三点:inline建议声明和定义分离,分离导致链接错误。...在链接的时候,会通过符号表(里面会有地址),而加上了内联,因为inline被展开,就没有函数地址了,链接就会找不到。 所以对于内联函数来说,声明和定义不需要分离。直接去.h文件进行定义就行了。...当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。

    68930

    【C++干货基地】揭秘C++11常用特性:内联函数 | 范围for | auto自动识别 | nullptr指针空值

    第二点就是宏他并没有类型安全检查就算是一个加法也有可能有人给你传俩个字符 第三点就是宏不方便调试,导致代码可读性差 所以在C++中就采用了内联函数和枚举来解决宏的使用的问题 以inline修饰的函数叫做内联函数...内联函数适合每个函数都用内联函数看起来不用开辟函数的栈帧空间大大结束了效率但是每个短小的函数都适合使用内联函数?...其实函数在调用次数过多的情况下就不适合使用内联函数,这样就会导致代码膨胀到处都是重复的代码,从而使得可执行程序变大; 还有在函数的递归时也不能使用内联函数函数栈帧是可以复用的,但内联函数一旦使用也导致代码膨胀...注: inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建 议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、 是递归、且频繁调用的函数采用...下图为 《C++prime》第五版关于inline的建议: 内联函数需要声明和定义分离? inline建议声明和定义分离,分离导致链接错误。

    7600

    C++之内联函数

    ③宏导致代码可读性差,可维护性差,容易误用(易出错)。...inline是建议编译器将 inline修饰的函数展开,但根据不同情况编译器具体决定是进行展开还是函数调用。...①如果内联函数一个函数(代码量较短),则编译器会将它展开,正常使用; ②如果内联函数一个函数(代码量较长),则编译器不会将它展开,而是用函数调用的方式使用这个函数。...(如果内联函数一个递归函数,也可能不会被展开) 为什么长函数展开?...(3)内联函数建议声明和定义分离 内联函数的声明和定义分离导致链接错误,所以使用内联函数就直接在该源文件中定义即可。 为什么内联函数不能声明和定义分离?

    58220

    C++打怪升级(三)- 内联函数 、auto、范围for循环

    优点:减少了函数调用的系统开销,提高了程序的运行效率; 缺点:如果内联函数被调用太多次,产生代码膨胀,导致编译生成的目标文件过大(安装包过大)。 内联函数一定会展开?...先说结论:不一定,取决于编译器。 inline对于编译器来说只是一个建议或请求,不同的编译器堆inline的实现机制可能不同,编译器是否接受我们发出的请求也不受我们控制,而是由编译器自己决定。...先说结论:内联函数一般定义在需要调用内联函数的源文件内,或者直接定义在头文件内,在包含头文件即可。 来看这个错误: 为什么? 为什么内联函数不能像普通函数那样声明和定义分离呢?...C++11中,标准委员赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一 个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得到。...当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译 器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量 #include using

    49620

    C++从入门到精通——内联函数

    在C++中,可以使用inline关键字声明内联函数。然而,编译器对于是否真正内联一个函数有最终决定权,即使函数被声明为内联编译器也可以选择不进行内联。...减少函数调用带来的代码膨胀:函数调用导致代码中出现大量的跳转指令,而内联函数的代码直接嵌入到调用的地方,可以减少跳转指令的数量,使代码更加紧凑。...需要注意的是,内联函数适用于函数体较小、频繁调用的情况。对于函数体过大或者调用频率较低的函数,使用内联可能导致代码膨胀、降低缓存命中率,反而影响性能。...下图为《C++prime》第五版关于inline的建议: inline建议声明和定义分离,分离导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。...(因为预编译阶段进行了替换) 2.导致代码可读性差,可维护性差,容易误用。 3.没有类型安全的检查 。 C++有哪些技术替代宏 常量定义 换用const 或 enum 短小函数定义 换用内联函数

    12310

    C++小白成长记:从基础到实战的详细入门教程

    流提取运算符自动处理空格和换行符,字符串输入时只读取第一个单词(遇到空格、换行停止)。 4. 缺省参数 4.1 缺省参数的概念 缺省参数是声明或定义函数函数的参数指定一个缺省值。...,可以通过函数重载来避免定义多个函数。...避免模糊重载: 当函数参数类型之间存在隐式转换时,可能导致编译器无法明确调用哪个重载函数,造成模糊调用。...7.5 不适合作为内联函数的场景 递归函数:递归函数不适合内联化,因为内联函数要求在编译时展开,而递归导致无限的展开。...7.6 内联函数的实际控制 虽然使用了 inline 关键字,但最终是否内联函数编译器决定编译器根据函数的大小、复杂性和调用频率等因素自动判断是否展开函数体。

    7310

    如何设计一个C++的类?

    类需要自己写构造函数和析构函数? 反正我每次定义一个类的时候都会明确把构造函数和析构函数写出来,即便它是空实现,即便我编译器视情况默认生成一个,自动生成的称为默认构造函数。...这个很明确,如果类作为基类被派生时,该基类的析构函数就一定要声明为虚函数,如果某个类确定不会被派生,那就不要声明其析构函数为虚函数。 类需要提供拷贝构造函数?...一般来说类的声明会写到头文件,类的定义会写到源文件中,但也有很多人会把定义写到头文件中,我还见过有人#include "xxx.cpp"呢,这里建议,不想让函数内联,那就把定义写到源文件中。...如果非内联函数在头文件中定义多个源文件都引用此头文件时编译器就会报错。至于类的声明写到头文件还是源文件中,视情况而定,看下面这段代码,某些类的声明写到了头文件中,又有些类的声明写到了源文件中!...tips:inline关键字只是开发者给编译器的请求,建议编译器内联处理,编译器具体做不做内联还得看它心情。

    1.5K20

    C++inline函数简介

    但是使用内联函数的时候,会出现类型匹配的编译错误。 (3)在类中声明同时定义的成员函数,自动转化为内联函数,因此内联函数可以访问类的成员变量,宏定义则不能。...如果函数库采用的是动态连接,那这一升级的f函数可以不知不觉的被程序使用。 (3)是否内联,程序员不可控。 inline函数只是对编译器的建议,是否对函数内联决定权在于编译器。...如果一个inline函数会在多个源文件中被用到,那么必须把它定义在头文件中。...所以如果一个inline函数会在多个源文件中被用到,那么必须把它定义在头文件中。...原因是:在类里定义时,这种函数会被编译器编译成内联函数,在类外定义函数则不会。内联函数的好处是加快程序的运行速度,缺点是增加程序的尺寸。

    2K20

    【C++】内联函数 ④ ( C++ 编译优化 - 没有 inline 关键字修饰的函数也可能被内联 | C++ 编译器内联限制 | 内联失败的几种情况 )

    决定的 ; 不能保证所有函数都会被内联 ; 即使函数内联 , 也不能保证 程序的性能 一定会提高 ; 2、C++ 编译器内联优化 简单且频繁调用的函数 内联大概率成功 , 复杂的函数 大概率内联失败..., 内联成功可能增加代码的大小 , 也可能导致程序运行速度变慢 ; 可以通过设置调整 C++ 编译器 的参数 和 优化级别 , 优化编译后的程序运行效果 ; 3、内联优化细节 即使没有使用inline...关键字修饰的函数 , C++编译器 根据 函数特性 和 调用频率 , 结合当前的 程序执行效率 和 综合性能 , 决定是否将函数进行内联 ; 内联函数的目的是减少函数调用的开销 , 提高程序的执行效率...; 编译器决定是否内联函数时 , 会考虑函数的复杂性 , 大小和调用次数等因素 ; 如果 函数比较简单 且被频繁调用 , 编译器可能会选择将其内联 , 以提高程序的执行效率 ; 二、C++ 编译器内联限制..., 内联直接失败 ; 内联函数声明在调用之后 : 由于内联函数不能进行声明操作 , 内联函数的声明与定义必须在一起 , 如果内联函数调用在声明定义之前 , 说明该内联函数进行了单独的声明 , 该函数内联一定会失败

    29630

    C++常见的面试知识点

    inline 内联函数的特征 相当于把内联函数里面的内容写在调用内联函数处; 相当于不用执行进入函数的步骤,直接执行函数体; 相当于宏,却比宏多了类型检查,真正具有函数特性; 编译器一般内联包含循环、...内联函数相比宏函数来说,在代码展开时,会做安全检查或自动类型转换(同普通函数),而宏定义则不会。在类中声明同时定义的成员函数,自动转化为内联函数,因此内联函数可以访问类的成员变量,宏定义则不能。...内联函数在运行时可调试,而宏定义不可以。 缺点 代码膨胀。内联是以代码膨胀(复制)为代价,消除函数调用带来的开销。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获很少。...inline函数的改变需要重新编译,不像 non-inline 可以直接链接。是否内联,程序员不可控。内联函数只是对编译器的建议,是否对函数内联决定权在于编译器。...union 联合 联合(union)是一种节省空间的特殊的类,一个 union 可以有多个数据成员,但是在任意时刻只有一个数据成员可以有值。当某个成员被赋值后其他成员变为未定义状态。

    76421

    CC++中inline用法详解

    这种方法保证对每个inline函数只有一个定义,且程序员无需复制代码,并且不可能在程序的生命期中引起无意的匹配的事情。...(二)内联函数的编程风格(摘自高质量C++/C 编程指南) 关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面起任何作用。...如果所有的函数都是内联函数,还用得着“内联”这个关键字内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的 执行效率。...所以不要随便地将构造函数和析构函数定义体放在类声明中。 一个好的编译器将会根据函数定义体,自动地取消不值得的内联(这进一步说明 了inline 不应该出现在函数的声明中)。...如果编译器没有发现内联函数存在错误,那么该函数的代码也被放入符号表里。 在调用一个内联函数时,编译器首先检查调用是否正确 (进行类型安全检查,或者进行自动类型转换,当然对所有的函数都一样)。

    1.8K30

    C++:04---内联函数

    牺牲代码空间,赢得了时间 内联说明只是向编译器发出一个请求,编译器可以选择忽略这个请求 2.关键字:inline 声明时写了inline,定义时可省略。...将内联函数放入头文件 关键字 inline 必须与函数定义体放在一起才能使函数成为内联,仅将 inline 放在函数声明前面起任何作用。...但是编译器是否将它真正内联则要看 Foo函数如何定义 内联函数应该在头文件中定义,这一点不同于其他函数。...但相比于放在源文件中,放在头文件中既能够确保调用函数定义是相同的,又能够保证在调用点能够找到函数定义从而完成内联(替换)。 但是你很奇怪,重复定义那么多次,不会产生链接错误?...在头文件中加入或修改 inline 函数时,使用了该头文件的所有源文件都必须重新编译。 8. 慎用内联 “如果所有的函数都是内联函数,还用得着“内联”这个关键字

    1.3K40

    【C++】C++基础语法

    ---- 3.同一文件命名空间名相同时 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。...就比如在官方库中,多个文件定义相同的命名空间名,在Queue.h中,定义的为 bit, 在Stack.h中,也是定义的bit,这会冲突??...那么,就会有这样一个问题,参数不同构成函数重载,那我要返回值不同构成函数重载可以?? 是因为函数名修饰规则没有带返回值的原因??...)、 是递归、且频繁调用的函数采用inline修饰,否则编译器忽略inline特性​​​​​​​。...inline建议声明和定义分离,分离导致链接错误。因为inline被展开,就没有函数地址 了,链接就会找不到。 只要加了inline内联,就不会生成符号表。

    1.4K20

    C++学习过程中的一些值得注意的小点(1)

    ,(有一个例子就是用户在下载软件的时候文件很大,导致下载时间很长)导致用户体验降低,这是很不利的影响。...1.2.3使用方式说明 鉴于内联函数的缺点,因此类中的函数定义的时候短小的函数(一般超过十行)可以考虑定义内联函数,代码量大的函数就不要定义内联函数了。...但我们其实也不必担心,因为现在的编译器已经十分的“聪明”了。lnline说明只是向编译器发出的一个请求,是否将函数定义内联函数还是取决于编译器自己的判断。...需要着重注意的是:内联函数不要声明和定义分离,分离导致链接错误。因为inline被展开就没有函数地址了,链接就会找不到。...从上面的代码可以看到,类实例化出来的对象大小只包含了成员变量的大小,当然也涉及内存对齐 (内存对齐在前面的博客中已有详细介绍),包含成员函数的大小。

    7510

    【C++】入门篇二

    一.内联函数 1.内联函数的概念 以关键字inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率 2....(2) 一般建议:将函数规模较小(即函数不是很长 , 取决于编译器)、不是递归、且频繁调用的函数采用inline修饰,否则编译器忽略inline特性 (3). inline建议声明和定义分离,分离导致链接错误...2.一般将 函数规模较小,不是递归、且频繁调用的函数采用inline修饰。 3.inline建议声明和定义分离 面试题 宏的优缺点? 优点: 1.增强代码的复用性。 2.提高性能。...常量定义 换用const enum 短小函数定义 换用内联函数 二.auto关键字(C++11) 1. auto的由来 std::map::iterator...当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译 器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量 auto a = 1, b = 2; auto

    4610

    内联函数 c-浅谈内联函数与宏定义的区别详解

    内联取代宏:   1.内联函数在运行时可调试,而宏定义不可以;   2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会;   3.内联函数可以访问类的成员变量,...(参见6.5节“使用断言”)   8.5.2 内联函数的编程风格   关键字inline必须与函数定义体放在一起才能使函数成为内联,仅将inline放在函数声明前面起任何作用。...如果所有的函数都是内联函数,还用得着“内联”这个关键字?   内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。...所以不要随便地将构造函数和析构函数定义体放在类声明中。   一个好的编译器将会根据函数定义体,自动地取消不值得的内联(这进一步说明了inline不应该出现在函数的声明中)。   ...每个类只有一个析构函数一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数)。

    66840

    C++心决之内联函数+auto关键字+指针空值

    7.内联函数 7.1 概念 以 inline 修饰 的函数叫做内联函数, 编译时 C++ 编译器会在 调用内联函数的地方展开 ,没有函数调 用建立栈帧的开销,内联函数提升程序运行的效率。...是一种 以空间换时间 的做法,如果编译器函数当成内联函数处理,在 编译阶段,函数体替换函数调用 ,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运 行效率。...inline 对于编译器而言只是一个建议,不同编译器关于 inline 实现机制可能不同 ,一般建 议:将 函数规模较小 ( 即函数不是很长,具体没有准确的说法,取决于编译器内部实现 ) 、 ...是递归、且频繁调用 的函数采用 inline 修饰,否则编译器忽略 inline 特性 3. inline 建议声明和定义分离,分离导致链接错误。...在同一行定义多个变量 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译 器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量 。

    11210

    【C++ 初阶】内联 auto&范围for循环&指针空值

    关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的 调用。...在debug模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认 会对代码进行优化,以下给出vs2013的设置方式) ​ 1.2 特性 内联的缺点 //Debug 版本下默认展开...一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、 是递归、且频繁调用的函数采用inline修饰,否则编译器忽略inline特性。...3. inline建议声明和定义分离,分离导致链接错误。...} 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。

    9110
    领券