函数内联的可能性取决于它在C++中定义的位置
Likelihood of a function being inlined depending on where it is defined in C++
当我开始考虑类的方法被内联的概率时,我正在编写一个 Vector 类(在数学意义上,而不是在std::vector
意义上),这取决于函数的定义方式。
我对以下情况感兴趣:
情况 1,函数体在头文件中的声明位置定义。
// Vector.h
class Vector
{
public:
// Other stuff up here
float Magnitude(void) const
{
return sqrt(X*X + Y*Y);
}
// Other stuff down here
}
情况 2,函数体在初始类定义之后的头文件中定义。
// Vector.h
class Vector
{
public:
// Other stuff up here
float Magnitude(void) const;
// Other stuff down here
}
// Other stuff up here
float Vector::Magnitude(void) const
{
return sqrt(X*X + Y*Y);
}
// Other stuff down here
情况 3,函数体在相应的 .cpp
文件中提供,将声明和定义分开。
// Vector.h
class Vector
{
public:
// Other stuff up here
float Magnitude(void) const;
// Other stuff down here
}
//Vector.cpp
#include "Vector.h"
// Other stuff up here
float Vector::Magnitude(void) const
{
return sqrt(X*X + Y*Y);
}
// Other stuff down here
情况 4,函数定义在作为编译器输入提供的相应.lib
文件中提供。
在5的情况下,函数定义是在相应的.dll
文件中提供的
在这 5 种情况下,函数被内联的概率是多少?我的意思不是确切的概率,我的意思是相互比较,哪些更有可能内联,哪些不太可能?
其他信息:
我故意忽略了inline
关键字以简化问题,因此它不会太宽泛。我知道还有许多其他问题可以解决内联问题,但我找不到有关每个案例的足够信息来特别解决这个问题。另外,我知道库已经存在预先制作的向量类,这不是练习的重点。
它主要取决于编译器,因为它们可以自由内联任何函数。
1)只有在第一种情况下,它才会尝试自动内联功能,因此添加inline
关键字是多余的。
)在情况2-3中,您必须添加inline
关键字,然后它可能会被内联。(仍然取决于编译器)
3) 在情况 4 和 5 中,由于 .lib
和 .dll
的代码已经编译,因此无法内联函数。(.dll
甚至只在运行时加载!
此外,许多编译器支持一个选项,允许它们自动内联任何合适的函数(-O3
gcc
)。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- #为""定义宏;静态";针对不同的上下文
- 如何确保C++函数在定义之前声明(如override关键字)
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在命名空间中定义函数还是限定函数
- 此代码是否违反一个定义规则
- 编译C++时未定义的引用
- 不同翻译单元中不可重载的非内联函数定义
- 为什么在定义函数之前先声明它
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- vscode g++链路故障:体系结构x86_64的未定义符号
- 如何定义一个纯抽象基类