我无法理解以下行为:一个标题包含一些基本类型,另一个标题我在几个函数中使用这些类型.之后我开始根据我定义的类型和函数构建类.在函数头中,如果我留下以下签名:
void whateverFunction(parameters)
Run Code Online (Sandbox Code Playgroud)
链接器指出whateverFunction有多个定义.现在如果将其更改为:
inline void whateverFunction(parameters)
Run Code Online (Sandbox Code Playgroud)
联系问题已经消失,所有编译和链接都很好.我所知道的内联是它用它的代码替换每个函数调用,而不是它非常暗,所以我的问题是:
链接器如何处理C++中的内联函数?
在C++中,如果方法是显式声明inline(或在头文件中定义),或者允许编译器在他们认为合适的情况下内联方法,那么这些方法是否只有内联?
我有一个.cpp文件,它有一些静态免费功能.我知道这对头文件有什么帮助,但由于cpp没有包含在任何地方,重点是什么?这有什么好处吗?
因为它完全取决于编译器是否可以内联我的函数,所以我可以完全停止使用这个关键字(假设它会内联所有内容)?
我对在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)
它到底是做什么的,为什么它可以帮助代码更快地运行?这是90年代的过时优化吗?
为什么我只能在小型函数上使用它?如果我为大型功能这样做会不好吗?
在大量功能上使用它是否不好?
我对内联函数有轻微的性能问题.请考虑以下代码: -
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++ 中的内联函数。我了解它们是如何工作的(在扩展代码而不是进行跳转等方面),但是当涉及到多个翻译单元 / *.cpp 文件时,我对如何使用它们感到有些困惑。
我已经读过,根据经验,我应该在头文件中包含函数本身的定义(而不仅仅是它的声明),然后在我打算使用所述内联函数的每个翻译单元中包含头文件。这对于内联函数来说不是问题,因为它只会在每个翻译中独立存在,并在需要时/如果需要(由编译器决定)进行扩展[如果我对任何一个错误,请纠正我!]
但是,我也读到在链接期间,即使头文件中不存在内联函数本身的定义,链接器也可以找到它的定义并在需要时扩展它。但是链接器如何能够从不同的翻译单元扩展一个函数呢?如果是这样,为什么我需要在每个翻译单元中包含函数的定义(通过头文件)?