在C+中内联所有方法+;,没有Cpp文件? 我想用C++编写一个运行性能最好的C++应用程序。所以我决定内联所有方法

在C+中内联所有方法+;,没有Cpp文件? 我想用C++编写一个运行性能最好的C++应用程序。所以我决定内联所有方法,c++,performance,inline,header-files,C++,Performance,Inline,Header Files,我提到了这个问题 如果我在MSVC 2015和MinGW编译器的cpp文件中使用内联关键字,则会出现未定义的引用错误 但是如果我想在头文件中内联所有方法,就不需要cpp文件。这是真的吗?为什么会这样?不,这不是真的。主函数不能按定义内联 不,这不是真的。主函数不能按定义内联 关键字inline与当今时代的性能无关,也与函数内联无关 事实上,它和一个定义规则(或ODR)有关 > ODR声明C++程序对每个函数只有一个定义。p> 这意味着以下情况将产生错误: file.cpp main.cpp 这

我提到了这个问题

如果我在MSVC 2015和MinGW编译器的cpp文件中使用内联关键字,则会出现未定义的引用错误


但是如果我想在头文件中内联所有方法,就不需要cpp文件。这是真的吗?为什么会这样?

不,这不是真的。主函数不能按定义内联

不,这不是真的。主函数不能按定义内联

关键字
inline
与当今时代的性能无关,也与函数内联无关

事实上,它和一个定义规则(或ODR)有关

<> > ODR声明C++程序对每个函数只有一个定义。p> 这意味着以下情况将产生错误:

file.cpp

main.cpp

这是一个错误,因为在两个不同的翻译单位(
.cpp
文件)中有两个相同函数的定义,这违反了ODR

现在,
inline
关键字允许您绕过这个问题。它允许您在多个平移单元中定义相同的函数,只要函数体完全相同!这允许您在头文件中定义函数,然后可以将其包含在多个
.cpp
文件中


话虽如此。您描述的内容不会导致性能下降。编译器将在适当的时间内联正确的函数。这将使您的代码运行速度超过您自己的速度

关键字
inline
与当今时代的性能无关,也与函数内联无关

事实上,它和一个定义规则(或ODR)有关

<> > ODR声明C++程序对每个函数只有一个定义。p> 这意味着以下情况将产生错误:

file.cpp

main.cpp

这是一个错误,因为在两个不同的翻译单位(
.cpp
文件)中有两个相同函数的定义,这违反了ODR

现在,
inline
关键字允许您绕过这个问题。它允许您在多个平移单元中定义相同的函数,只要函数体完全相同!这允许您在头文件中定义函数,然后可以将其包含在多个
.cpp
文件中



话虽如此。您描述的内容不会导致性能下降。编译器将在适当的时间内联正确的函数。这将使您的代码运行速度超过您自己的速度

那么?一个只有一个cpp文件的大项目?那么?如今,只有一个cpp文件的大型项目?内联与性能无关。编写代码使其正常工作。如果速度慢,则使用探查器确定速度慢的部分并修复该部分。根据需要重复。不要只决定需要内联所有内容。@deviantfan那么你对性能有什么建议?@matinlotfalie:优化规则:1)不要(首先让你的程序健壮)。2) 不要(让你的程序可读)配置文件。只优化那些需要优化的功能;看看用户是怎么想的。如果你有性能问题,很可能是因为你使用了错误的算法或数据结构,而不是因为你没有把所有东西都内联起来……内联现在与性能无关编写代码让它工作。如果速度慢,则使用探查器确定速度慢的部分并修复该部分。根据需要重复。不要只决定需要内联所有内容。@deviantfan那么你对性能有什么建议?@matinlotfalie:优化规则:1)不要(首先让你的程序健壮)。2) 不要(让你的程序可读)配置文件。只优化那些需要优化的功能;看看用户的想法。如果您遇到性能问题,很可能是因为您使用了错误的算法或数据结构,而不是因为您没有将所有内容内联……这是错误的。在我的IAR编译器中,在调试模式(无优化)下,内联函数可以产生很大的不同。在我正在开发的嵌入式系统上,我们没有使用发布模式。发布调试代码时不带符号(以便更轻松地调试返回的产品)。我已经在汇编语言列表中显示了内联确实起到了作用。@ThomasMatthew您是在调试模式下发布成品的吗?我不能对那件事耿耿于怀。无论如何,我想说的一点是,你不应该通过声明内联哪一个函数来完成编译器的工作。“它可以为您做到这一点。@ThomasMatthews这相当于将
寄存器
放在变量前面,以节省内存访问。在一个未优化的构建中,它可能会带来不同。但是任何寻求性能的人都会让编译器优化代码,这样就不需要
内联
寄存器
。顺便说一句,过度的内联实际上可能会影响性能。编译器可能会避免这个陷阱。@ThomasMatthews这是我的观点-
register
可以提高调试版本的速度,但在发布版本时它是无用的,因为使用寄存器可能是优化编译器为您做的第一件事。由于在大多数情况下,编译器负责代码优化(它的作用远不止内联和分配寄存器),因此
inline
register
的使用情况非常有限。“调试模式(无优化)…嵌入式系统”-用所有额外的资源看着你,让willynilly到处乱扔。这是错误的。在我的IAR编译器中,在调试模式(无优化)下
void fun() {}
void fun() {}