我应该何时inline在C++中为函数/方法编写关键字?
看到一些答案,一些相关的问题:
我应该何时不写在C++函数/方法关键字"内联"?
什么时候编译器不知道何时使函数/方法'内联'?
当一个应用程序为函数/方法写入"内联"时,是否多线程是否重要?
我知道inline是对编译器的提示或请求,用于避免函数调用开销.
那么在什么基础上可以确定函数是否是内联的候选者?在哪种情况下应该避免内联?
我相信,inline已经过时,因为我在这里读到:
无论你如何指定一个函数
inline,它都是一个允许编译器忽略的请求:编译器可能内联扩展一些,全部或没有你调用指定函数的地方inline.
然而,Angew似乎理解我不知道的事情.在这个问题中他和我来回走了很多,关于是否inline仍然有用.
这个问题不是一个问题:
inline或在哪里inline仍可用于向编译器提示inline功能:我应该何时为函数/方法编写关键字'inline'?.inline运行代码:强制其他翻译单元中的内联函数请记住,编译器可以随意使用inline,因此inline在那里没有用处:可以inline用来强制而不是建议编译代码的更改?
我正在阅读inline关于isocpp FAQ的这个问题,代码是给出的
void f()
{
int x = /*...*/;
int y = /*...*/;
int z = /*...*/;
// ...code that uses x, y and z...
g(x, y, z);
// ...more code that uses x, y and z...
}
Run Code Online (Sandbox Code Playgroud)
然后它说
假设一个典型的C++实现具有寄存器和堆栈,寄存器和参数在调用之前就被写入堆栈
g(),然后从堆栈内部g()读取参数 并再次读取以在g()返回时 恢复寄存器f().但是,这是一个很多不必要的阅读和写作的,尤其是当编译器能够使用寄存器变量的情况下x,y和z:每个变量可以被写入两次(如寄存器,也可以作为一个参数)和出两次(在使用时g()和在返回期间恢复寄存器f()).
我很难理解上面的段落.我尝试列出我的问题如下:
f()函数的功能与g(x, y, z)函数相同.x, y, z在调用之前如何进入g()寄存器,传入的参数g() …虽然在某些情况下使用内联函数会非常方便,
内联函数有什么缺点吗?
结论:
显然,使用内联函数没有任何问题.
但值得注意的是以下几点!
过度使用内联实际上可以使程序变慢.根据函数的大小,内联它可能会导致代码大小增加或减少.内联一个非常小的访问器函数通常会减少代码大小,而内联一个非常大的函数可以大大增加代码大小.在现代处理器上,较小的代码通常由于更好地使用指令缓存而运行得更快. - Google指南
随着函数大小的增加,内联函数的速度优势趋于减小.在某些时候,与函数体的执行相比,函数调用的开销变小,并且失去了好处- Source
内联函数可能无法正常工作的情况很少:
__inline仅当指定optimize选项时,关键字才会使函数内联.如果指定了optimize,则是否__inline遵循优先级取决于内联优化程序选项的设置.默认情况下,只要运行优化程序,内联选项就会生效.如果指定optimize,则还必须指定noinline选项(如果要__inline忽略关键字).-资源
我是一名C/C++开发人员,这里有几个问题总让我感到困惑.
谢谢
我遇到了一个声明为C函数的例子:
static inline CGPoint SOCGPointAdd(const CGPoint a, const CGPoint b) {
return CGPointMake(a.x + b.x, a.y + b.y);
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我在.h文件中声明了实用程序C函数并在.m文件中实现它们,就像这样:
CGPoint SOCGPointAdd(const CGPoint a, const CGPoint b) {
return CGPointMake(a.x + b.x, a.y + b.y);
}
Run Code Online (Sandbox Code Playgroud)
我可以在任何我想要的地方"内联"使用这个函数,它也应该是"静态的",因为它不与任何对象相关联,比如Objective-c方法.指定"静态"和"内联"的重点是什么?
我关注着的东西,如定义CGPoint关于如何创建自己的功能提示,但我不知道的目的CG_INLINE.幕后发生了什么?
CG_INLINE CGPoint
CGPointMake(CGFloat x, CGFloat y)
{
CGPoint p; p.x = x; p.y = y; return p;
}
CG_INLINE CGSize
CGSizeMake(CGFloat width, CGFloat height)
{
CGSize size; size.width = width; size.height = height; return size;
}
Run Code Online (Sandbox Code Playgroud) 我想知道是否有一种简单的方法来编写c ++类函数的别名.例如,如果我有一些list容器对象,那么逻辑函数就是
int list::length() { return len; }
Run Code Online (Sandbox Code Playgroud)
但程序员可能使用的另一个逻辑别名可能是
int list::size() { return len; }
Run Code Online (Sandbox Code Playgroud)
因此,有没有任何方法可以创建list::size()别名list::length(),使其在编译时不重复,而是引用相同的函数?
我已经读过你可以这样做了#define,但是我不想在某个地方完全超出范围的其他代码名称(即'size'变量)引起任何混淆.
我还读过函数指针可以修复它,但这不是一个别名(因为它必须应用去引用),也不能给函数指针一个声明,给用户一个令人困惑的帮助线(我想),加上混乱,如果我需要将我的代码嵌套在另一个对象中(我必须调整范围).
我的一个猜测是,大多数优化编译器将以下内容作为直接函数别名:
inline int list::length() { return len; }
inline int list::size() { return length(); }
Run Code Online (Sandbox Code Playgroud)
或者,c ++有任何严格的"别名"语法吗?(我找不到任何 - 不确定)
那么,这样做最有效的方法是什么?
编辑:我接受了答案只是为了结束这个问题,因为这只是我的一个好奇心.任何有良好信息的人,请添加评论或回答,我甚至可能会改变我的答案.
c++ ×8
inline ×3
c ×2
function ×2
objective-c ×2
alias ×1
class ×1
cocoa ×1
deprecated ×1
ios ×1
methods ×1
optimization ×1
tradeoff ×1