阿里巴巴实习生笔试题含答案
答案:D
内联函数:
Tip:只有当函数只有10 行甚至更少时才将其定义为内联函数.
定义: 当函数被声明为内联函数之后, 编译器会将其内联展开, 而不是按一般的函数调用机制进行调用.
优点: 当函数体比较小的时候, 内联该函数能够令目标代码更加高效. 对于存取函数以及其它函数体比较短, 性能关键的函数, 鼓励使用内联. 缺点: 滥用内联将导致程序变慢. 内联可能使目标代码量或增或减, 这取决于内联函数的大小. 内联非常短小的存取函数一般会减少代码大小, 但内联一个相当大的函数将戏剧性的增加代码
大小. 现代处理器由于更好的利用了指令缓存, 小巧的代码往往执行更快。
结论: 一个较为合理的经验准则是, 不要内联超过10 行的函数. 谨慎对待析构函数, 析构函数往往比其表面看起来要更长, 因为有隐含的成员和基类析构函数被调用!
另一个实用的经验准则: 内联那些包含循环或switch 语句的函数常常是得不偿失(除非在大多数情况下, 这些循环或switch 语句从不被执行).
注意:有些函数即使声明为内联的也不一定会被编译器内联, 这点很重要; 比如虚函数和递归函数就不会被正常内联. 一般, 递归函数不应该声明成内联函数.(递归调用堆栈的展开并不像循环那么简单, 比如递归层数在编译时可能是未知的, 大多数编译器都不支持内联递归函数). 虚函数内联的主要原因则是想把它的函数体放在类定义内, 为了图个方便, 抑或是当作文档描述其行为, 比如精短的存取函数.
-inl.h文件:
Tip:复杂的内联函数的定义, 应放在后缀名为-inl.h 的头文件中.
内联函数的定义必须放在头文件中, 编译器才能在调用点内联展开定义. 然而, 实现代码理论上应该放在 .cc 文件中, 我们不希望 .h 文件中有太多实现代码, 除非在可读性和性能上有明显优势.
如果内联函数的定义比较短小, 逻辑比较简单, 实现代码放在 .h 文件里没有任何问题. 比如, 存取函数的实现理所当然都应该放在类定义内. 出于编写者和调用者的方便, 较复杂的内联函数也能够放到 .h 文件中, 如果你觉得这样会使头文件显得笨重, 也能够把它萃取到单独的-inl.h 中. 这样把实现和类定义分离开来, 当需要时包含对应的-inl.h 即可。
A 项错误,因为使用 inline 关键字的函数只是
用户希望它成为内联函数,但编译器有权忽略这个请求,比如:若此函数体太大,则不会把它作为内联函数展开的。
B 项错误,头文件中不但要包含 inline 函数的
声明,而且必须包含定义,且在定义时必须加上 inline 。
【关键字 inline 必须与函数定义体放在一起才能使函数成为内联,仅
将 inline 放在函数声明前面不起任何作用】
C 项错误, inline 函数能够定义在源文件中,
但多个源文件中的同名 inline 函数的实现必须相同。
一般把 inline 函数的定义放在头文件中更加合适。
D 项正确,类内的成员函数,默认都
是 inline 的。
【定义在类声明之中的成员函数将自动地成为内联函数】
EF 项无意思,不论是 class 声明中定义的 inline 函数,还是 class 实现中定义
的 inline 函数,不存在优先不优先的问题,因为 class 的成员函数都是 inline 的,加了关键字 inline 也没什么特殊的
答案:D 插入排序
改良的冒泡最优也是n。