什么占用更多空间:对象或结构

What occupies more space: Object or Struct?

本文关键字:对象 结构 空间 什么      更新时间:2023-10-16

每当我们从类创建一个对象时,它都是在堆上创建的,与在堆栈上占用内存的结构变量相比,它占用了更多的空间。如果我创建一个具有相同属性的 Person 类和一个结构 P,那么它应该证明我刚才所说的是合理的。请检查以下 2 个代码片段:

#include <iostream.h>
#include <conio.h>
#include <string>
using namespace std;
class Person{
      int age;
      string hair_color;
      float height;
      public:
      Person::Person(int n)
      {
       age = n;
      }
      int Person::getAge()
      {
        return age;    
      }

      };
struct P{
       int age;

       };      
main()
{
     Person person(45);
     //Person *person = new Person(45);

     P myPerson;
     cout<<sizeof(person)<<endl;
     cout<<sizeof(myPerson)<<endl;
     //cout<<"Age: "<<person->getAge(); 
    getch();  
}

当我编写此代码时:

#include <iostream.h>
#include <conio.h>
#include <string>
using namespace std;
class Person{
      int age;
      string hair_color;
      float height;
      public:
      Person::Person(int n)
      {
       age = n;
      }
      int Person::getAge()
      {
        return age;    
      }

      };
struct P{
       int age;

       };      
main()
{
    // Person person(45);
     Person *person = new Person(45);

     P myPerson;
     cout<<sizeof(person)<<endl;
     cout<<sizeof(myPerson)<<endl;

    getch();  
}

如果我在这里对对象和引用有误,请纠正我。我想从我的代码中知道什么占用更多空间:对象还是结构?

在某些语言 (C#) 中,struct用于定义可以堆栈分配的类型,而必须在堆上分配class实例。

C++中,没有这样的区别,由实例化器决定是在堆上还是在堆栈上分配对象。例如

Person* person = new Person(45);

堆上分配Person实例,而

Person person(45);

在堆栈上分配类似的实例。

此外,通常没有什么可以支持"在堆上创建,与占用堆栈内存的结构变量相比,占用更多空间"的说法。堆分配通常会带来一些开销(内存和处理时间),但堆栈空间通常要有限得多(通常是每个线程的固定堆栈大小)。

有很多关于何时使用什么的文档,甚至关于 SO 的分类。简而言之,堆栈将用于小型、生存期较短的对象(函数范围内的临时对象或类似对象)。

在C++中,structclass在如何分配和占用多少空间方面完全相同 - 主要区别在于class的默认值是数据是私有的,您需要为要向类外部公开的任何成员组添加public:, 其中struct默认具有公共成员,如果要拥有私有成员,则需要添加private:

无论是在堆、堆栈还是全局内存中分配某些内容完全取决于使用类/结构的代码是如何编写的(例如,调用 new 将在堆栈上分配,不调用 new 将分配全局空间或堆栈),如果对象是structclass,则绝对没有区别 - 如果它们具有相同的内容。

当结构中的数据是"纯数据"并且没有构造函数或成员函数时,通常使用struct,当涉及成员函数和/或构造函数时,使用class。然而,这是一个约定,两者之间绝对没有技术差异:

 struct Coord3D
 {
    float x, y, z;
 };

 class Coord3D
 {
    public:
      float x, y, z;
 };

或介于两者之间

struct Person
{
  private:
     int age; 
     std::string name;
  public:
     int getAge() { return age; }
     std::string getName() { return name; }
};

class Person
{
  // no need to have private:, but most people add it just to be perfectly clear
     int age; 
     std::string name;
  public:
     int getAge() { return age; }
     std::string getName() { return name; }
};

(编译使用两种替代形式之一的代码,并且完全不可能从生成的二进制代码中分辨它是第一个还是第二个)

除了其他答案之外,structclass是模板,告诉编译器某些东西是如何组织的。 structclass不会占用可执行文件中的任何空间,因为它们仅在编译期间使用。

对象通常称为classstruct实例。 对象占用内存。 占用的内存量取决于实例化它的structclass的定义。

因此,在回答您的问题标题时,Which occupies more space: Object or Struct? ,对象确实如此,因为struct只是一个模板,而对象是实例化。

请记住

,在C++中,结构体和类不是不同类型的东西。它们是一回事struct语法糖,用于创建具有公共成员和方法的class,并默认为公共继承。

具体说来:

Bjarne Stroustrup在"C++编程语言"一书的第10.2.8节中指出:

根据定义,结构是一个类,其中成员是公共的 违约;那是

struct s { ...  

只是简写

class s { public:...

C++标准规定(第 11.2 节,第 2 项):

在没有基类的访问说明符的情况下,public 当派生类声明为struct并且private 当类声明为 class 时假定。