Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “罚款”;内联的;班级_C++_Visual Studio_Class - Fatal编程技术网

C++ “罚款”;内联的;班级

C++ “罚款”;内联的;班级,c++,visual-studio,class,C++,Visual Studio,Class,VisualStudio允许您创建“内联”类(如果我没有弄错名称的话)。 所以类头和实现都在一个文件中 文件包含类和函数的定义和声明,根本没有.cpp文件 所以我想知道这样做是否会受到惩罚?有什么缺点吗 非常感谢没有处罚。 但这也并不意味着代码实际上是内联的 他们inline关键字只是一个compier提示,通常会被忽略,因为编译器在知道何时内联代码方面通常比开发人员聪明得多 这样做有什么惩罚吗?有什么缺点吗 对。如果您需要更改该类的实现,因为它位于头文件中,所以该类的所有用户都需要重新编译,即

VisualStudio允许您创建“内联”类(如果我没有弄错名称的话)。 所以类头和实现都在一个文件中

文件包含类和函数的定义和声明,根本没有.cpp文件

所以我想知道这样做是否会受到惩罚?有什么缺点吗

非常感谢

没有处罚。
但这也并不意味着代码实际上是内联的

他们inline关键字只是一个compier提示,通常会被忽略,因为编译器在知道何时内联代码方面通常比开发人员聪明得多

这样做有什么惩罚吗?有什么缺点吗


对。如果您需要更改该类的实现,因为它位于头文件中,所以该类的所有用户都需要重新编译,即使他们应该只关心接口。对于某些项目,这可能相当昂贵

您可以使用任何编译器将类的完整实现放在标题中。通常在编译时间方面会有一个惩罚——对于包含它的每个源文件,都会分别编译头文件


在代码膨胀方面也可能会受到惩罚——将函数定义放在类定义内隐式声明它们是内联的,因此编译器可能会单独为每个函数生成代码,而不是在一个位置生成代码,并在别处生成对它的调用。

内联关键字只是编译器内联代码的提示。Visual Studio为函数提供了一个_forceinline说明符,使编译器在没有成本/效益分析的情况下强制内联函数

关于_uforceinline:

包含所有定义和声明的*.h文件不应该有任何区别,但大型文件的编译时间除外。

有两个“惩罚”

  • 其中一个将在编译时进行评估。如果您有一个非常大的项目,那么您将拥有大量头文件,预处理器将使用更多的代码将这些头文件彼此展开。更改一个.h文件将在包含它的所有文件中触发重新编译
  • 另一个原因是,它(可能)导致更大的二进制文件,因为该代码被复制到其他对象文件中

    • 如果你问我,这是一个非常糟糕的主意,尤其是对于大型项目。看看LaOS的“大规模C++软件设计”来了解这种方法的缺点。

      < P>还有另一个潜在的惩罚:性能。
      如果将太多函数内联,这会导致代码膨胀,从而导致可执行文件中的函数和循环可能无法放入目标CPU的指令缓存中。

      Cool,非常感谢您的回答:)内联说明符更常用于强制函数具有内部链接。@Billy ONeal+1:没错!当我想在头文件本身中声明和定义一个自由函数并避免出现链接器问题时,我已经多次使用内联。(主要是因为我不想只为这个小函数创建一个*.cpp文件:)