C++ 运算符方法是否占用c+中的内存+;物体?

C++ 运算符方法是否占用c+中的内存+;物体?,c++,object,memory,operators,operator-overloading,C++,Object,Memory,Operators,Operator Overloading,假设我有一些简单的类/结构,除了数据和一些特定的操作符之外什么都没有。如果我理解,一个基本结构只有C++中的数据,就像C一样,占用的内存和成员一样多。比如说, struct SomeStruct { float data; } sizeof(SomeStruct) == sizeof(float); // this should evaluate to true 我想知道的是,向类中添加运算符是否会使对象在内存中变大。比如说 struct SomeStruct { public: So

假设我有一些简单的类/结构,除了数据和一些特定的操作符之外什么都没有。如果我理解,一个基本结构只有C++中的数据,就像C一样,占用的内存和成员一样多。比如说,

struct SomeStruct { float data; }
sizeof(SomeStruct) == sizeof(float); // this should evaluate to true
我想知道的是,向类中添加运算符是否会使对象在内存中变大。比如说

struct SomeStruct
{
public:
    SomeStruct & operator=(const float f) { data = f; return this; }
private:
    float data;
}

sizeof(SomeStruct)==sizeof(float)
的计算结果仍然是真的吗?是否有任何运算符/方法不会增加内存中对象的大小?

结构不一定只有其成员那么大(考虑填充和对齐),但您基本上是正确的,因为:

函数不是数据,也不是“存储”在对象类型中。


也就是说,在向类型添加虚拟函数的情况下,要注意添加虚拟表指针。这是该类型的一次性大小增加,并且在添加更多虚拟函数时不会重新应用。

结构可能不一定仅与其成员一样大(考虑填充和对齐),但您基本上是正确的,因为:

函数不是数据,也不是“存储”在对象类型中。


也就是说,在向类型添加虚拟函数的情况下,要注意添加虚拟表指针。这是一种一次性的大小增加,当你添加更多的虚拟函数时,它不会重新应用。

< P>当我学习C++和OOP时,我读到了一些地方(一些坏的来源),C++中的对象本质上与C函数中的函数指针相同。 它们在功能上可能是这样的,但如果它们真的是这样实现的,那将是巨大的空间浪费,因为所有对象实例都必须存储相同的指针

方法代码存储在一个中心位置,C++使它看起来很方便,就像每个实例都有方法一样。 (运算符本质上是具有不同语法的函数)

类内定义的方法和运算符不会增加实例化对象的大小。您可以自己测试:

#include <iostream>
using namespace std;

struct A {
  int a;
};
struct B {
  int a;
  //SOME RANDOM METHODS AND OPERATORS
  B() : a(1) {cout<<"I'm the constructor and I set 'a' to 1"<<endl;}
  void some_method() const { for(int i=0;i<40;i++) cout<<"loop";}
  B operator+=(const B& b){
    a+=b.a;
    return *this;
  }
  size_t my_size() const { return sizeof(*this);}


};

int main(){

cout<<sizeof(A)<<endl;
cout<<B().my_size()<<endl;

}

= >大小没有变化。

< P>当我学习C++和OOP时,我读到了一些地方(一些坏的来源),C++中的对象本质上与C函数中的函数指针相同。 它们在功能上可能是这样的,但如果它们真的是这样实现的,那将是巨大的空间浪费,因为所有对象实例都必须存储相同的指针

方法代码存储在一个中心位置,C++使它看起来很方便,就像每个实例都有方法一样。 (运算符本质上是具有不同语法的函数)

类内定义的方法和运算符不会增加实例化对象的大小。您可以自己测试:

#include <iostream>
using namespace std;

struct A {
  int a;
};
struct B {
  int a;
  //SOME RANDOM METHODS AND OPERATORS
  B() : a(1) {cout<<"I'm the constructor and I set 'a' to 1"<<endl;}
  void some_method() const { for(int i=0;i<40;i++) cout<<"loop";}
  B operator+=(const B& b){
    a+=b.a;
    return *this;
  }
  size_t my_size() const { return sizeof(*this);}


};

int main(){

cout<<sizeof(A)<<endl;
cout<<B().my_size()<<endl;

}
==>大小没有变化

我想知道的是,向类中添加运算符是否会使对象在内存中变大

答案是“视情况而定”

如果类在添加函数之前不是多态的,并且这个新函数使类保持非多态性,那么添加这个非多态函数对类实例的大小没有任何影响

另一方面,如果添加此新函数确实使类具有多态性,则此添加将使类的实例更大。大多数C++实现使用虚拟表,或者简称VTABLE。多态类的每个实例都包含指向该类的vtable的指针。非多态类的实例不需要,因此不包含vtable指针

最后,向已经是多态的类添加另一个虚拟函数不会使类实例变大。此添加确实使该类的vtable更大,但vtable本身不是实例的一部分。vtable指针是实例的一部分,并且该指针已经是类布局的一部分,因为类已经是多态的

我想知道的是,向类中添加运算符是否会使对象在内存中变大

答案是“视情况而定”

如果类在添加函数之前不是多态的,并且这个新函数使类保持非多态性,那么添加这个非多态函数对类实例的大小没有任何影响

另一方面,如果添加此新函数确实使类具有多态性,则此添加将使类的实例更大。大多数C++实现使用虚拟表,或者简称VTABLE。多态类的每个实例都包含指向该类的vtable的指针。非多态类的实例不需要,因此不包含vtable指针


最后,向已经是多态的类添加另一个虚拟函数不会使类实例变大。此添加确实使该类的vtable更大,但vtable本身不是实例的一部分。VTABLE指针是实例的一部分,并且指针已经是类布局的一部分,因为类已经是多态的。

虚拟函数是什么?@ GuyGre:好的,在一些实现中,您有一个VTABLE要考虑。但是函数本身从未存储在对象中。你能解释一下填充和对齐是什么意思吗?是否有任何原因,例如,<代码>某个结构StutalRay[100 ] < /C> >将有不同的大小,从<代码>浮点数组[100 ] < /代码>?我没有任何关于编译器如何为C++对象或对象数组分配内存的书籍。你心目中有这样的人吗?标准中是否规定了对象内存的打包方式?我从来没有上过涵盖这些主题的课程(主要是因为我没有计算机科学学位)@xaviersjs:如果你