标签: inline-functions

C++中内联函数的好处?

在C++中使用内联函数的优点/缺点是什么?我看到它只会提高编译器输出的代码的性能,但是使用今天的优化编译器,快速CPU,大容量存储器等(不像1980年那样<内存稀缺,一切都必须适合100KB内存)什么他们今天真的有优势吗?

c++ inline-functions

253
推荐指数
6
解决办法
17万
查看次数

何时在Kotlin中使用内联函数?

我知道内联函数可能会提高性能并导致生成的代码增长,但我不确定何时正确使用它.

lock(l) { foo() }
Run Code Online (Sandbox Code Playgroud)

编译器可以发出以下代码,而不是为参数创建函数对象并生成调用.(来源)

l.lock()
try {
  foo()
}
finally {
  l.unlock()
}
Run Code Online (Sandbox Code Playgroud)

但我发现kotlin没有为非内联函数创建的函数对象.为什么?

/**non-inline function**/
fun lock(lock: Lock, block: () -> Unit) {
    lock.lock();
    try {
        block();
    } finally {
        lock.unlock();
    }
}
Run Code Online (Sandbox Code Playgroud)

function inline-functions kotlin

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

外部内联

我理解"内联"本身就是对编译器的建议,并且在它的结构中它可能会或可能不会内联函数,它也会产生可链接的目标代码.

我认为"静态内联"执行相同的操作(可能内联也可能不内联),但在内联时不会产生可链接的目标代码(因为没有其他模块可以链接到它).

"extern inline"在哪里适合图片?

假设我想用内联函数替换预处理器宏,并要求此函数被内联(例如,因为它使用__FILE__和__LINE__宏,这些宏应该为调用者而不是这个调用函数解析).也就是说,如果函数没有内联,我想看到编译器或链接器错误."extern inline"这样做吗?(我假设,如果没有,除了坚持使用宏之外,没有办法实现这种行为.)

C++和C之间是否存在差异?

不同编译器供应商和版本之间是否存在差异?

c c++ extern inline-functions

86
推荐指数
3
解决办法
4万
查看次数

内联函数中的静态变量

我有一个在头文件中声明和定义的函数.这本身就是一个问题.如果未内联该函数,则使用该标头的每个翻译单元都会获得该函数的副本,并且当它们链接在一起时会重复.我通过使函数内联来"修复",但我担心这是一个脆弱的解决方案,因为据我所知,即使指定了"inline"关键字,编译器也不保证内联.如果不是这样,请纠正我.

无论如何,真正的问题是,这个函数里面的静态变量会发生什么?我最终会收到多少份?

c++ linker header inline-functions

74
推荐指数
4
解决办法
3万
查看次数

Python等效于内联函数或宏

我刚刚意识到这一点

x.real*x.real+x.imag*x.imag
Run Code Online (Sandbox Code Playgroud)

比做的快三倍

abs(x)**2
Run Code Online (Sandbox Code Playgroud)

其中x是一个复数的numpy数组.为了代码可读性,我可以定义一个类似的函数

def abs2(x):
    return x.real*x.real+x.imag*x.imag
Run Code Online (Sandbox Code Playgroud)

它仍然比abs(x)**2快得多,但它是以函数调用为代价的.是否可以内联这样的函数,就像在C中使用宏或使用内联关键字一样?

python optimization inline-functions

49
推荐指数
5
解决办法
4万
查看次数

"内联"关键字vs"内联"概念

我问这个基本问题是为了让记录笔直.已经提到这个问题它的目前公认的答案,这是不能令人信服的.然而,第二多投票的答案提供了更好的洞察力,但也不完美.

在阅读下面时,区分inline 关键字和"内联" 概念.

这是我的看法:

内联概念

这样做是为了节省函数的调用开销.它更类似于宏式代码替换.没有什么可争议的.

inline关键字

感知A.

inline关键字是一个请求,以通常用于较小的函数的编译器,以便编译器可以优化它和做出更快的呼叫.编译器可以忽略它.

我对此提出异议,原因如下:

  1. 不会内联更大和递归的函数,编译器会忽略该inline关键字.
  2. 无论inline提及或不提及关键字,优化器都会自动内联较小的函数.

很明显,用户对使用关键字的函数内联没有任何控制权inline.

感知B

inline没有做内联的概念.把inline大/递归函数的未来将不利于小功能,不再需要它,为被内联.

确定使用的inline是保持一个定义规则.

即如果声明了一个函数,inline那么只有下面的东西是强制性的:

  1. 即使在多个转换单元中找到它的主体(例如,在多个.cpp文件中包含该头),编译器也只生成1个定义并避免多个符号链接器错误.(注意:如果该函数的主体不同,那么它是未定义的行为.)
  2. inline功能的主体必须在使用它的所有翻译单元中可见/可访问.换句话说,在任何一个文件中声明inline函数.h和定义将导致其他文件的"未定义的符号链接器错误" .cpp.cpp

判决书

"A"感觉完全错误,"B"感觉完全正确.

标准中有一些引用,但我期待一个答案,从逻辑上解释这个判决是真还是假.

c c++ inline-functions language-lawyer

37
推荐指数
2
解决办法
2990
查看次数

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

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

内联函数有什么缺点吗?

结论:

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

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

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

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

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

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

c++ inline-functions

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

有没有办法在swift中声明内联函数?

我对快速的语言很新

我想在c ++中声明一个内联函数,所以我的有趣声明就像

func MyFunction(param: Int) -> Int {
...
...
...
}
Run Code Online (Sandbox Code Playgroud)

我想要做类似的事情

inline func MyFunction(param: Int) -> Int {
...
...
...
}
Run Code Online (Sandbox Code Playgroud)

我试图在网上搜索,但我没有找到任何相关的可能没有内联关键字,但也许还有另一种内联函数的方法

非常感谢 :)

inline-functions swift

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

我什么时候应该使用__forceinline而不是内联?

Visual Studio包含对__forceinline的支持.Microsoft Visual Studio 2005文档指出:

__forceinline关键字会覆盖成本/收益分析,而是依赖于程序员的判断.

这提出了一个问题:编译器的成本/收益分析何时出错?而且,我怎么知道这是错的?

在什么情况下假设我在这个问题上比我的编译器更清楚?

c++ inline-functions visual-studio

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

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

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

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

谢谢

c++ optimization tradeoff inline-functions

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