Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.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++ - Fatal编程技术网

C++ 类的对象与方法共享相同的代码段?

C++ 类的对象与方法共享相同的代码段?,c++,C++,例如,我们有代码 class MyClass { private: int data; public: int getData() { return data; } }; int main() { MyClass A, B, C; return 0; } 由于A、B和C是MyClass的对象,因此它们都有自己的内存。 我的问题是,是所有这些对象都为类的方法共享相同的内存(在本例中是getData()),还是所有对象都为每个对象有单独

例如,我们有代码

class MyClass
{
   private:
   int data;
   public:
   int getData()
   {
      return data;
   }
};

int main()
{
   MyClass A, B, C;
   return 0;
}
由于A、B和C是
MyClass
的对象,因此它们都有自己的内存。 我的问题是,是所有这些对象都为类的方法共享相同的内存(在本例中是
getData()
),还是所有对象都为每个对象有单独的代码段

TnaHK提前….

它们共享相同的代码段。

它们共享相同的代码段。

相同

你可能对这方面的知识感兴趣。

同样


你可能对知识感兴趣。

< P> C++的标准在这个问题上没有什么可说的。如果您的体系结构支持多个代码段,那么是否使用多个代码段取决于您使用的编译器和链接器的实现。然而,任何实现都不太可能为每个类或对象创建单独的段。或者为每个对象生成单独的代码。方法属于类,而不是单独的对象。

< P> C++对该主题没有什么可说的。如果您的体系结构支持多个代码段,那么是否使用多个代码段取决于您使用的编译器和链接器的实现。然而,任何实现都不太可能为每个类或对象创建单独的段。或者确实为每个对象生成单独的代码-方法属于类,而不是单个对象。

一般来说,对于类和对象,它是如何工作的:

类是对数据及其操作的描述


对象是对象类型(它表示的类)和属性值的规范。由于对象的类型已保存,编译器将知道在何处查找对该对象调用的方法。因此,即使在创建新对象时创建了数据的新副本,方法仍然是固定的。

一般来说,对于类和对象,其工作原理如下:

类是对数据及其操作的描述


对象是对象类型(它表示的类)和属性值的规范。由于对象的类型已保存,编译器将知道在何处查找对该对象调用的方法。因此,即使在创建新对象时创建了数据的新副本,方法仍然是固定的。

在您的示例中,MyClass::getData()是“内联的”,因此在这种情况下,每个实例的指令位置在某些情况下可能位于不同的位置

大多数编译器只有在启用优化时才真正使用内嵌代码(即使这样也可能选择不这样做)。但是,如果在头文件中定义了此内联代码,则编译器必然会为使用该类的每个编译单元生成代码,即使该类在编译单元中没有内联。然后,链接器可以优化代码的多个实例,也可以不优化代码的多个实例


对于未内联定义的代码,除非优化人员决定内联代码,否则所有实例通常共享相同的代码;除非链接器非常智能,否则只有在类被实例化并在定义它的同一编译单元中使用时才会发生这种情况。

在您的示例中,MyClass::getData()是“内联的”,因此在这种情况下,每个实例的指令位置在某些情况下可能位于不同的位置

大多数编译器只有在启用优化时才真正使用内嵌代码(即使这样也可能选择不这样做)。但是,如果在头文件中定义了此内联代码,则编译器必然会为使用该类的每个编译单元生成代码,即使该类在编译单元中没有内联。然后,链接器可以优化代码的多个实例,也可以不优化代码的多个实例


对于未内联定义的代码,除非优化人员决定内联代码,否则所有实例通常共享相同的代码;除非链接器非常聪明,否则只有当类被实例化并在定义的同一编译单元中使用时才会发生。

内部C++对象模型可能会有一些答案。我自己没有读过,里面的C++对象模型可能会有一些答案。我自己没有读过。我喜欢这些抽象的(而且完全正确的)答案。C++标准没有说明这些事情,但是有一个平台(你知道)支持多个片段吗?@尼古拉是的——16位窗口。许多嵌入式平台根本没有代码段的概念,我知道C++不涉及堆栈和堆,我可以想象没有它们的系统。但我不知道有一个系统实际上实现了多个代码段。我太年轻了,或者你太老了:)我想你和尼尔用“片段”这个词来表达不同的意思。@Clifford想进一步说明吗?我喜欢这些抽象(而且完全正确)的答案。C++标准没有说明这些事情,但是有一个平台(你知道)支持多个片段吗?@尼古拉是的——16位窗口。许多嵌入式平台根本没有代码段的概念,我知道C++不涉及堆栈和堆,我可以想象没有它们的系统。但我不知道有一个系统实际上实现了多个代码段。我太年轻了,或者你太老了:)我想你和尼尔用“片段”这个词来表达不同的意思。@Clifford想进一步解释一下吗?