首页 > 试题广场 >

关于c++的inline关键字,以下说法正确的是()

[单选题]
关于c++的inline关键字,以下说法正确的是()
  • 使用inline关键字的函数会被编译器在调用处展开
  • 头文件中可以包含inline函数的声明
  • 可以在同一个项目的不同源文件内定义函数名相同但实现不同的inline函数
  • 定义在Class声明内的成员函数默认是inline函数
  • 优先使用Class声明内定义的inline函数
  • 优先使用Class实现的内inline函数的实现

A 项错误,因为使用 inline 关键字的函数只是用户希望它成为内联函数,但编译器有权忽略这个请求,比如:若此函数体太大,则不会把它作为内联函数展开的。

B 项错误,头文件中不仅要包含 inline 函数的声明,而且必须包含定义,且在定义时必须加上 inline 。【关键字 inline 必须与函数定义体放在一起才能使函数成为内联,仅将 inline 放在函数声明前面不起任何作用】

C 项错误, inline 函数可以定义在源文件中,但多个源文件中的同名 inline 函数的实现必须相同。一般把 inline 函数的定义放在头文件中更加合适。

D 项正确,类内的成员函数,默认都是 inline 的。【定义在类声明之中的成员函数将自动地成为内联函数】

EF 项无意思,不管是 class 声明中定义的 inline 函数,还是 class 实现中定义的 inline 函数,不存在优先不优先的问题,因为 class 的成员函数都是 inline 的,加了关键字 inline 也没什么特殊的。

编辑于 2016-09-04 11:21:05 回复(5)
 内联函数:

Tip: 只有当函数只有 10 行甚至更少时才将其定义为内联函数.

定义: 当函数被声明为内联函数之后, 编译器会将其内联展开, 而不是按通常的函数调用机制进行调用.
优点: 当函数体比较小的时候, 内联该函数可以令目标代码更加高效. 对于存取函数以及其它函数体比较短, 性能关键的函数, 鼓励使用内联.
缺点: 滥用内联将导致程序变慢. 内联可能使目标代码量或增或减, 这取决于内联函数的大小. 内联非常短小的存取函数通常会减少代码大小, 但内联一个相当大的函数将戏剧性的增加代码大小. 现代处理器由于更好的利用了指令缓存, 小巧的代码往往执行更快。
结论: 一个较为合理的经验准则是, 不要内联超过 10 行的函数. 谨慎对待析构函数, 析构函数往往比其表面看起来要更长, 因为有隐含的成员和基类析构函数被调用!
另一个实用的经验准则: 内联那些包含循环或 switch 语句的函数常常是得不偿失 (除非在大多数情况下, 这些循环或 switch 语句从不被执行).
有些函数即使声明为内联的也不一定会被编译器内联, 这点很重要; 比如虚函数和递归函数就不会被正常内联. 通常, 递归函数不应该声明成内联函数.(递归调用堆栈的展开并不像循环那么简单, 比如递归层数在编译时可能是未知的, 大多数编译器都不支持内联递归函数). 虚函数内联的主要原因则是想把它的函数体放在类定义内, 为了图个方便, 抑或是当作文档描述其行为, 比如精短的存取函数.

-inl.h文件:


Tip: 复杂的内联函数的定义, 应放在后缀名为 -inl.h 的头文件中.


内联函数的定义必须放在头文件中, 编译器才能在调用点内联展开定义. 然而, 实现代码理论上应该放在 .cc 文件中, 我们不希望 .h 文件中有太多实现代码, 除非在可读性和性能上有明显优势.

如果内联函数的定义比较短小, 逻辑比较简单, 实现代码放在 .h 文件里没有任何问题. 比如, 存取函数的实现理所当然都应该放在类定义内. 出于编写者和调用者的方便, 较复杂的内联函数也可以放到 .h 文件中, 如果你觉得这样会使头文件显得笨重, 也可以把它萃取到单独的 -inl.h 中. 这样把实现和类定义分离开来, 当需要时包含对应的 -inl.h 即可。


A 如果只声明含有inline关键字,就没有内联的效果。 内联函数的定义必须放在头文件中, 编译器才能在调用点内联展开定义.   有些函数即使声明为内联的也不一定会被编译器内联, 这点很重要; 比如虚函数和递归函数就不会被正常内联. 通常, 递归函数不应该声明成内联函数.
B 内联函数应该在头文件中定义,这一点不同于其他函数。编译器在调用点内联展开函数的代码时,必须能够找到 inline 函数的定义才能将调用函数替换为函数代码,而对于在头文件中仅有函数声明是不够的。
C 当然内联函数定义也可以放在源文件中,但此时只有定义的那个源文件可以用它,而且必须为每个源文件拷贝一份定义(即每个源文件里的定义必须是完全相同的),当然即使是放在头文件中,也是对每个定义做一份拷贝,只不过是编译器替你完成这种拷贝罢了。但相比于放在源文件中,放在头文件中既能够确保调用函数是定义是相同的,又能够保证在调用点能够找到函数定义从而完成内联(替换)。
对于由两个文件compute.C和draw.C构成的程序来说,程序员不能定义这样的min()函数,它在compute.C中指一件事情,而在draw.C中指另外一件事情。如果两个定义不相同,程序将会有未定义的行为:

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

D 正确。 定义在类声明之中的成员函数将自动地成为内联函数,例如:
class A {   public:  void Foo(int x, int y) { ... }   // 自动地成为内联函数   

EF 在每个调用该inline函数的文件中包含该头文件。这种方法保证对每个inline函数只有一个定义,且程序员无需复制代码,并且不可能在程序的生命期中引起无意的不匹配的事情。最好只有一个定义!
发表于 2016-06-15 12:19:37 回复(1)
垃圾题目!A选项说的是会,又没说一定会!而且这句话隐含这是一个按标准定义的inline函数,说会没什么问题。如果真要考cpp primer的灰线知识还是换题吧!
B说的是可以包含声明,我先在head文件里声明再在里面定义不就好了?
发表于 2016-07-14 15:05:16 回复(0)
A: 使用inline关键字的函数不一定会被编译器在调用处展开,inline只是建议而已,编译器不一定会真的展开.
D: 定义在类的申明内的成员函数, 确实默认是inline函数啊. 没明白为什么不对.

发表于 2016-05-06 20:02:17 回复(2)
1.inline关键字的函数只是用户希望它成为内联函数,但编译器有权忽略这个请求,比如:此函数体太大,则不会把它作为内联函数展开;
2.关键字inline必须与函数定义体放在一起才能使函数成为内联,仅仅将inline放在函数声明前面不起任何作用;
3.inline函数可以定义在源文件中,但多个源文件中的同名inline函数的实现必须相同,所以一般把inline函数的定义放在头文件中更合适;
4.类中的成员函数,默认都是inline的;定义在类声明之中的成员函数将自动地成为内联函数;
5.class中的无论声明或实现的inline函数,一视同仁,均为inline函数,没有优先一说
发表于 2019-04-12 18:24:34 回复(0)
A 项错误,使用 inline 关键字的函数只是用户希望它成为内联函数,但编译器有权忽略这个请求。比如:内敛包含循环或switch语句的函数大多数时候是没有用的,这些循环或switch语句从不被执行;内联析构函数时应注意:析构函数可能存在隐含的成员函数和基类析构函数被调用,比表面上更长;递归函数一般不建议声明为内联函数,递归不像循环,编译阶段是无法确定递归层数的。
B 项错误,头文件中不仅要包含 inline 函数的声明,而且必须包含定义,且在定义时必须加上 inline 。关键字 inline 必须与函数定义体放在一起才能使函数成为内联,仅将 inline 放在函数声明前面不起任何作用
C 项错误, inline 函数可以定义在源文件中,但多个源文件中的同名 inline 函数的实现必须相同。一般把 inline 函数的定义放在头文件中更加合适。 
D 项正确,类内的成员函数,默认都是 inline的。定义在类声明之中的成员函数将自动地成为内联函数。
EF 项错误, class 的成员函数都是 inline 的,加了关键字 inline也没有优先问题。
编辑于 2019-02-08 18:17:28 回复(0)
概念,定义在class类内的声明的成员函数默认是inline函数。
发表于 2018-10-21 18:21:41 回复(0)
来自@搁浅的鱼儿 
内联函数:

Tip: 只有当函数只有 10 行甚至更少时才将其定义为内联函数.

定义: 当函数被声明为内联函数之后, 编译器会将其内联展开, 而不是按通常的函数调用机制进行调用.
优点: 当函数体比较小的时候, 内联该函数可以令目标代码更加高效. 对于存取函数以及其它函数体比较短, 性能关键的函数, 鼓励使用内联.
缺点: 滥用内联将导致程序变慢. 内联可能使目标代码量或增或减, 这取决于内联函数的大小. 内联非常短小的存取函数通常会减少代码大小, 但内联一个相当大的函数将戏剧性的增加代码大小. 现代处理器由于更好的利用了指令缓存, 小巧的代码往往执行更快。
结论: 一个较为合理的经验准则是, 不要内联超过 10 行的函数. 谨慎对待析构函数, 析构函数往往比其表面看起来要更长, 因为有隐含的成员和基类析构函数被调用!
另一个实用的经验准则: 内联那些包含循环或 switch 语句的函数常常是得不偿失 (除非在大多数情况下, 这些循环或 switch 语句从不被执行).
有些函数即使声明为内联的也不一定会被编译器内联, 这点很重要; 比如虚函数和递归函数就不会被正常内联. 通常, 递归函数不应该声明成内联函数.(递归调用堆栈的展开并不像循环那么简单, 比如递归层数在编译时可能是未知的, 大多数编译器都不支持内联递归函数). 虚函数内联的主要原因则是想把它的函数体放在类定义内, 为了图个方便, 抑或是当作文档描述其行为, 比如精短的存取函数.

-inl.h文件:


Tip: 复杂的内联函数的定义, 应放在后缀名为 -inl.h 的头文件中.


内联函数的定义必须放在头文件中, 编译器才能在调用点内联展开定义. 然而, 实现代码理论上应该放在 .cc 文件中, 我们不希望 .h 文件中有太多实现代码, 除非在可读性和性能上有明显优势.

如果内联函数的定义比较短小, 逻辑比较简单, 实现代码放在 .h 文件里没有任何问题. 比如, 存取函数的实现理所当然都应该放在类定义内. 出于编写者和调用者的方便, 较复杂的内联函数也可以放到 .h 文件中, 如果你觉得这样会使头文件显得笨重, 也可以把它萃取到单独的 -inl.h 中. 这样把实现和类定义分离开来, 当需要时包含对应的 -inl.h 即可。
如果只声明含有inline关键字,就没有内联的效果。 内联函数的定义必须放在头文件中, 编译器才能在调用点内联展开定义.   有些函数即使声明为内联的也不一定会被编译器内联, 这点很重要; 比如虚函数和递归函数就不会被正常内联. 通常, 递归函数不应该声明成内联函数.
内联函数应该在头文件中定义,这一点不同于其他函数。编译器在调用点内联展开函数的代码时,必须能够找到 inline 函数的定义才能将调用函数替换为函数代码,而对于在头文件中仅有函数声明是不够的。
C 当然内联函数定义也可以放在源文件中,但此时只有定义的那个源文件可以用它,而且必须为每个源文件拷贝一份定义(即每个源文件里的定义必须是完全相同的),当然即使是放在头文件中,也是对每个定义做一份拷贝,只不过是编译器替你完成这种拷贝罢了。但相比于放在源文件中,放在头文件中既能够确保调用函数是定义是相同的,又能够保证在调用点能够找到函数定义从而完成内联(替换)。
对于由两个文件compute.C和draw.C构成的程序来说,程序员不能定义这样的min()函数,它在compute.C中指一件事情,而在draw.C中指另外一件事情。如果两个定义不相同,程序将会有未定义的行为:

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

正确。 定义在类声明之中的成员函数将自动地成为内联函数,例如:
1
classA {   public:  voidFoo(intx, inty) { ... }   // 自动地成为内联函数   } 

EF 在每个调用该inline函数的文件中包含该头文件。这种方法保证对每个inline函数只有一个定义,且程序员无需复制代码,并且不可能在程序的生命期中引起无意的不匹配的事情。最好只有一个定义!
发表于 2017-07-23 17:06:21 回复(0)
定义在Class声明内的成员函数默认是inline函数 ! 没毛病!!
发表于 2017-01-11 21:43:25 回复(0)
这道题是钻牛角尖的垃圾题。
发表于 2017-07-17 15:33:47 回复(0)
我觉得D选项有问题啊。。。内联如果定义过长,就不是内联了啊。也没有规定类声明内定义的成员函数必须简短精炼。如果我写个三十行的函数体,放在类声明里面定义,它也能默认为内联?
发表于 2022-01-23 11:18:15 回复(0)
C++要求对一般的内置函数要用关键字inline声明,但对类内定义的成员函数,可以省略inline,因为这些成员函数已被隐含地指定为内置函数。
发表于 2019-05-05 17:00:40 回复(0)
A 项错误,因为使用 inline 关键字的函数只是用户希望它成为内联函数,但编译器有权忽略这个请求,比如:若此函数体太大,则不会把它作为内联函数展开的。 B 项错误,头文件中不仅要包含 inline 函数的声明,而且必须包含定义,且在定义时必须加上 inline 。【关键字 inline 必须与函数定义体放在一起才能使函数成为内联,仅将 inline 放在函数声明前面不起任何作用】 C 项错误, inline 函数可以定义在源文件中,但多个源文件中的同名 inline 函数的实现必须相同。一般把 inline 函数的定义放在头文件中更加合适。 D 项正确,类内的成员函数,默认都是 inline 的。【定义在类声明之中的成员函数将自动地成为内联函数】 EF 项无意思,不管是 class 声明中定义的 inline 函数,还是 class 实现中定义的 inline 函数,不存在优先不优先的问题,因为 class 的成员函数都是 inline 的,加了关键字 inline 也没什么特殊的。
发表于 2019-04-13 21:42:45 回复(0)
题目能答案能严禁么,拼什么不能放在头文件里面。
发表于 2019-03-20 14:42:16 回复(0)
inline关键字修饰的函数不一定被编译器展开
发表于 2019-02-03 12:59:12 回复(0)

,因为使用 inline 关键字的函数只是用户希望它成为内联函数,但编译器有权忽略这个请求,比如:若此函数体太大,则不会把它作为内联函数展开的。

B 项错误,头文件中不仅要包含 inline 函数的声明,而且必须包含定义,且在定义时必须加上 inline 。【关键字 inline 必须与函数定义体放在一起才能使函数成为内联,仅将 inline 放在函数声明前面不起任何作用】

C 项错误, inline 函数可以定义在源文件中,但多个源文件中的同名 inline 函数的实现必须相同。一般把 inline 函数的定义放在头文件中更加合适。

D 项正确,类内的成员函数,默认都是 inline 的。【定义在类声明之中的成员函数将自动地成为内联函数】

EF 项无意思,不管是 class 声明中定义的 inline 函数,还是 class 实现中定义的 inline 函数,不存在优先不优先的问题,因为 class 的成员函数都是 inline 的,加了关键字 inline 也没什么特殊的。

发表于 2017-11-04 20:10:49 回复(0)
关于A 有些函数使用inline 编译器不认,所以就跟普通函数没什么区别,不是所有有inline 关键字的都会被编译器识别为内联函数, 关于B 头文件中不要包含inline 函数的声明,因为声明和实现不能混为一谈。inline 关键字只有跟实现放在一起,才会有意义 关于C 多个源文件的同名inline函数的实现必须相同 关于D 定义在类里面的函数将自动成为内联函数 关于EF 内联函数不牵扯优先级问题
编辑于 2017-05-17 22:40:30 回复(0)
ABD
发表于 2016-07-21 13:07:53 回复(0)
inline关键字要熟悉
发表于 2016-06-28 11:21:14 回复(0)
头文件必须包含inline声明,不是可以。头文件可以包含inline定义。
发表于 2016-06-12 13:58:17 回复(0)