例如我们有代码
class MyClass
{
private:
int data;
public:
int getData()
{
return data;
}
};
int main()
{
MyClass A, B, C;
return 0;
}
由于A,B和C是MyClass
的对象,因此都有自己的记忆。
我的问题是,所有这些对象是否为类的方法(在这种情况下为getData()
)共享相同的内存,或者所有对象对每个对象都有单独的代码段。?
答案 0 :(得分:2)
他们 usually 共享相同的代码段。
答案 1 :(得分:2)
C ++标准对此主题无话可说。如果您的体系结构支持多个代码段,那么是否使用多个段取决于您正在使用的编译器和链接器的实现。但是,任何实现都不太可能为每个类或对象创建单独的段。或者确实为每个对象生成单独的代码 - 方法属于类,而不是单个对象。
答案 2 :(得分:0)
相同。
答案 3 :(得分:0)
通常,对于类和对象,以下是它的工作原理:
类是对该数据的数据和操作的描述。
对象是对象类型(它表示的类)和属性值的规范。由于保存了对象的类型,编译器将知道在何处查找对象上调用的方法。因此,即使在创建新对象时创建了新的数据副本,这些方法仍然是固定的。
答案 4 :(得分:0)
在您的示例中,MyClass :: getData()是'inline',因此在这种情况下,每个实例的指令位置可能位于某些情况下的不同位置。
大多数编译器在启用优化时才真正实现内联代码(即使那时也可能选择不执行此操作)。但是,如果在头文件中定义了这个内联代码,则编译器必须为使用该类的每个编译单元生成代码,即使它没有在编译单元中内联。链接器可能会或可能不会优化代码的多个实例。
对于未内联定义的代码,除非优化器决定内联代码,否则所有实例通常都会共享相同的代码;除非链接器非常智能,否则只有在实例化类并在定义它的同一编译单元中使用时才会发生。