相关疑难解决方法(0)

内联函数链接

我无法理解以下行为:一个标题包含一些基本类型,另一个标题我在几个函数中使用这些类型.之后我开始根据我定义的类型和函数构建类.在函数头中,如果我留下以下签名:

void whateverFunction(parameters)
Run Code Online (Sandbox Code Playgroud)

链接器指出whateverFunction有多个定义.现在如果将其更改为:

inline void whateverFunction(parameters)
Run Code Online (Sandbox Code Playgroud)

联系问题已经消失,所有编译和链接都很好.我所知道的内联是它用它的代码替换每个函数调用,而不是它非常暗,所以我的问题是:

链接器如何处理C++中的内联函数?

c++ inline function

19
推荐指数
2
解决办法
7501
查看次数

什么时候编译器内联C++代码?

在C++中,如果方法是显式声明inline(或在头文件中定义),或者允许编译器在他们认为合适的情况下内联方法,那么这些方法是否只有内联?

c++ compiler-construction optimization inline

18
推荐指数
3
解决办法
8487
查看次数

制作自由静态功能有什么好处吗?

我有一个.cpp文件,它有一些静态免费功能.我知道这对头文件有什么帮助,但由于cpp没有包含在任何地方,重点是什么?这有什么好处吗?

c++

16
推荐指数
2
解决办法
6082
查看次数

我可以完全停止使用"内联"吗?

因为它完全取决于编译器是否可以内联我的函数,所以我可以完全停止使用这个关键字(假设它会内联所有内容)?

c++ compiler-construction inline

9
推荐指数
2
解决办法
282
查看次数

有关内联性能的问题

我对在C和C ++中的函数上使用内联有一些疑问。有人告诉我在经常使用的小功能上使用它,但是我想确切地了解它是如何工作的。这只是一个示例片段。

static inline point3D createPoint3D(float x, float y, float z){
   point3D newPosition;
   newPosition.x = x;
   newPosition.y = y;
   newPosition.z = z;
   return newPosition;
}
Run Code Online (Sandbox Code Playgroud)
  1. 它到底是做什么的,为什么它可以帮助代码更快地运行?这是90年代的过时优化吗?

  2. 为什么我只能在小型函数上使用它?如果我为大型功能这样做会不好吗?

  3. 在大量功能上使用它是否不好?

c c++ optimization inline

2
推荐指数
1
解决办法
1001
查看次数

内联函数性能

我对内联函数有轻微的性能问题.请考虑以下代码: -

inline int left(int x) {
    return 2*x;
}
inline int right(int x) {
    return 2*x+1;
}

main() {
    for(int i=0;i<200000000;i++) {
        int L=left(i);
        int R=right(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

这在编译和执行时(带有和不带有-finline-function标志)在我的计算机上大约需要1.90秒.但是,当我用宏替换内联函数时,它只需要1.26秒.虽然函数执行2亿次的可能性很小,但我仍然想知道是否有使用内联函数实现这种性能的方式?

编辑:在收到几个令人反感的评论后,我意识到我对自己的问题不是很清楚.我只是想知道如何在不使用任何优化标志的情况下实现相同的性能.当然,单纯使用-O2或-O3更为明智,我只想学习.

c++ performance inline function

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

跨多个 C++ 翻译单元的内联函数

我最近学习了 C++ 中的内联函数。我了解它们是如何工作的(在扩展代码而不是进行跳转等方面),但是当涉及到多个翻译单元 / *.cpp 文件时,我对如何使用它们感到有些困惑。

我已经读过,根据经验,我应该在头文件中包含函数本身的定义(而不仅仅是它的声明),然后在我打算使用所述内联函数的每个翻译单元中包含头文件。这对于内联函数来说不是问题,因为它只会在每个翻译中独立存在,并在需要时/如果需要(由编译器决定)进行扩展[如果我对任何一个错误,请纠正我!]

但是,我也读到在链接期间,即使头文件中不存在内联函数本身的定义,链接器也可以找到它的定义并在需要时扩展它。但是链接器如何能够从不同的翻译单元扩展一个函数呢?如果是这样,为什么我需要在每个翻译单元中包含函数的定义(通过头文件)?

c++ inline

2
推荐指数
1
解决办法
292
查看次数