相关疑难解决方法(0)

我应该何时为函数/方法编写关键字'inline'?

我应该何时inline在C++中为函数/方法编写关键字?

看到一些答案,一些相关的问题:

  • 我应该何时写在C++函数/方法关键字"内联"?

  • 什么时候编译器不知道何时使函数/方法'内联'?

  • 当一个应用程序为函数/方法写入"内联"时,是否多线程是否重要?

c++ inline one-definition-rule

526
推荐指数
6
解决办法
12万
查看次数

何时使用内联功能何时不使用?

我知道inline是对编译器的提示或请求,用于避免函数调用开销.

那么在什么基础上可以确定函数是否是内联的候选者?在哪种情况下应该避免内联?

c c++ inline

173
推荐指数
5
解决办法
9万
查看次数

内联仍然有用吗?

我相信,inline已经过时,因为我在这里读到:

无论你如何指定一个函数inline,它都是一个允许编译器忽略的请求:编译器可能内联扩展一些,全部或没有你调用指定函数的地方inline.

然而,Angew似乎理解我不知道的事情.在这个问题中他和我来回走了很多,关于是否inline仍然有用.

这个问题不是一个问题:

请记住,编译器可以随意使用inline,因此inline在那里没有用处:可以inline用来强制而不是建议编译代码的更改?

c++ methods inline function deprecated

85
推荐指数
2
解决办法
2万
查看次数

如何知道变量是在寄存器中还是在堆栈中?

我正在阅读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, yz:每个变量可以被写入两次(如寄存器,也可以作为一个参数)和出两次(在使用时g()和在返回期间恢复寄存器f()).

我很难理解上面的段落.我尝试列出我的问题如下:

  1. 对于计算机对驻留在主存储器中的某些数据执行某些操作,是否必须首先将数据加载到某些寄存器然后CPU才能对数据进行操作?(我知道这个问题与C++没有特别的关系,但理解这个问题将有助于理解C++的工作原理.)
  2. 我认为f()函数的功能与g(x, y, z)函数相同.x, y, z在调用之前如何进入g()寄存器,传入的参数g() …

c++ cpu-registers

42
推荐指数
4
解决办法
5595
查看次数

使用内联函数有什么问题?

虽然在某些情况下使用内联函数会非常方便,

内联函数有什么缺点吗?

结论:

显然,使用内联函数没有任何问题.

但值得注意的是以下几点!

  • 过度使用内联实际上可以使程序变慢.根据函数的大小,内联它可能会导致代码大小增加或减少.内联一个非常小的访问器函数通常会减少代码大小,而内联一个非常大的函数可以大大增加代码大小.在现代处理器上,较小的代码通常由于更好地使用指令缓存而运行得更快. - Google指南

  • 随着函数大小的增加,内联函数的速度优势趋于减小.在某些时候,与函数体的执行相比,函数调用的开销变小,并且失去了好处- Source

  • 内联函数可能无法正常工作的情况很少:

    • 对于返回值的函数; 如果存在return语句.
    • 对于不返回任何值的函数; 如果存在循环,开关或goto语句.
    • 如果函数是递归的.-资源
  • __inline仅当指定optimize选项时,关键字才会使函数内联.如果指定了optimize,则是否__inline遵循优先级取决于内联优化程序选项的设置.默认情况下,只要运行优化程序,内联选项就会生效.如果指定optimize,则还必须指定noinline选项(如果要__inline忽略关键字).-资源

c++ inline-functions

36
推荐指数
3
解决办法
1万
查看次数

我为什么要使用内联代码?

我是一名C/C++开发人员,这里有几个问题总让我感到困惑.

  • "常规"代码和内联代码之间有很大区别吗?
  • 哪个是主要区别?
  • 内联代码只是宏的"形式"吗?
  • 在选择内联代码时必须做出哪些权衡?

谢谢

c++ optimization tradeoff inline-functions

31
推荐指数
4
解决办法
2万
查看次数

24
推荐指数
3
解决办法
2万
查看次数

为什么将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方法.指定"静态"和"内联"的重点是什么?

c objective-c

23
推荐指数
3
解决办法
2万
查看次数

CG_INLINE做什么?

我关注着的东西,如定义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)

cocoa objective-c ios

15
推荐指数
3
解决办法
3346
查看次数

c ++类函数别名

我想知道是否有一种简单的方法来编写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++ alias class function

11
推荐指数
1
解决办法
4441
查看次数