在C++中使用内联函数的优点/缺点是什么?我看到它只会提高编译器输出的代码的性能,但是使用今天的优化编译器,快速CPU,大容量存储器等(不像1980年那样<内存稀缺,一切都必须适合100KB内存)什么他们今天真的有优势吗?
可以使用哪些技术来加速C++编译时间?
这个问题出现在Stack Overflow问题C++编程风格的一些评论中,我很想知道它有什么想法.
我见过一个相关的问题,为什么C++编译需要这么长时间?,但这并没有提供很多解决方案.
我倾向于编写相当大的模板化标头C++库,我的用户通常会抱怨编译时间.在想到这件事之后,我突然意识到我不知道时间会在哪里.是否有一些简单的方法来使用常见的编译器(例如g ++,icc和xlC)来分析C++编译过程?例如,是否可以了解在C++编译的每个阶段花费了多少时间?
在该文件中file1.c,调用在文件中实现的函数file2.c.当我链接file1.o,并file2.o为可执行文件,如果该功能file2是非常小的,将连接器自动检测功能小,内联呼吁?
在编译C++代码时,GCC是否会尝试通过选择未标记inline关键字的内联函数来优化速度?
我可以获得一系列常见的C++优化实践吗?
我的意思是优化是你必须修改源代码才能更快地运行程序,而不是改变编译器设置.
我们的应用程序的源代码是数十万行,数千个文件,并且在非常古老的地方 - 该应用程序最初是在1995年或1996年编写的.在过去的几年里,我的团队已经大大提高了源代码的质量,但是一个问题仍然是特别困扰我:许多类在其头文件中完全定义了许多方法.
在某些情况下,我对在头文件中内联声明的方法没有任何问题 - 一个struct的构造函数,一个简单的方法,其中内联可以使它更快(我们有一些像这样的数学函数),等等.但内联方法的自由使用没有明显原因是:
最后一个原因现在可能会给我们带来问题,这是通过代码库并将大多数定义移动到源文件的一个很好的理由.
我们的代码库非常庞大. 是否有可以为我们(大部分)做这个的自动化工具?
笔记:
出于习惯,我经常为简单的函数内联函数定义,例如这个(人为的例子)
class PositiveInteger
{
private:
long long unsigned m_i;
public:
PositiveInteger (int i);
};
inline PositiveInteger :: PositiveInteger (int i)
: m_i (i)
{
if (i < 0)
throw "oops";
}
Run Code Online (Sandbox Code Playgroud)
我一般喜欢分离界面文件和实现文件,但是,这是我习惯于那些我脑子里的声音告诉我的热门可能会受到很多打击的功能.
我知道这个建议是"简介第一"并且我同意但是如果我事先知道编译器会生成相同的最终目标代码,无论是否在编译或链接时内联这些函数,我都可以避免一大堆分析工作.(另外,我相信注入的性能分析代码本身会导致时序的变化,从而影响非常简单的函数的效果,例如上面的那个.)
GCC 5.1刚刚发布了广告LTO(链接时间优化)的改进.他们真的有多好?知道最终可执行文件的哪些功能可以安全地内联不会受到影响?
我正在做一些关于制作内联函数的速度优势的研究.我没有这本书,但是我正在阅读的一篇文章暗示了进行函数调用需要相当大的开销; 当可执行文件的大小可以忽略不计,或者可以保留时,应该内联函数声明一个函数,以提高速度.
我已经编写了下面的代码来测试这个理论,从我所知道的,将内联函数声明为没有速度的好处.这两个函数在我的计算机上调用4294967295次时,在196秒内执行.
我的问题是,你对于为什么会这样做有什么想法?是现代编译器优化吗?是否缺乏功能中发生的大量计算?
任何有关此事的见解将不胜感激.在此先感谢朋友们.
#include < iostream >
#include < time.h >
// RESEARCH Jared Thomson 2010
////////////////////////////////////////////////////////////////////////////////
// Two functions that preform an identacle arbitrary floating point calculation
// one function is inline, the other is not.
double test(double a, double b, double c);
double inlineTest(double a, double b, double c);
double test(double a, double b, double c){
a = (3.1415 / 1.2345) / 4 + 5;
b = 9.999 / a + (a * a);
c = …Run Code Online (Sandbox Code Playgroud) 我在foo.h头文件中定义了以下类
class Foo {
public:
inline int Method();
};
inline int Foo::Method() { // Implementation }
Run Code Online (Sandbox Code Playgroud)
我现在想将实现移动到一个foo.cpp文件.为此,我必须删除inline关键字并将方法的实现移动到这样的foo.cpp文件
#include `foo.h`
inline int Foo::Method() { // Implementation }
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
inline关键字的声明是否正确?是否必须删除?inline关键字会影响性能(实际上我的所有方法都是内联的)?非常感谢你提前.
c++ ×9
inline ×4
optimization ×4
gcc ×3
c ×2
c++builder ×1
class ×1
compilation ×1
g++ ×1
linker ×1
methods ×1
profiling ×1
refactoring ×1