-3

每当我们从一个类创建一个对象时,它是在堆上创建的,与占用堆栈内存的结构变量相比,它占用更多空间。如果我创建了一个具有相同属性的 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();  
}

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

4

4 回答 4

5

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

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

Person* person = new Person(45);

在堆上分配Person实例,而

Person person(45);

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

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

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

于 2013-10-26T16:50:00.557 回答
5

在 C++ 中,astruct和 aclass在分配方式和占用空间方面完全相同 - 主要区别在于 a 的默认值class是数据是私有的,您需要public:为任何成员组添加你想暴露给类的外部,struct默认情况下 a 有公共成员,如果你想有私有成员,你需要添加private:.

是否在堆、堆栈或全局内存中分配某些内容完全取决于使用类/结构的代码的编写方式(例如,调用new将在堆栈上分配,不调用 new 将在全局空间或堆栈上分配) 并且对象是 astruct或 a绝对没有区别class- 如果它们具有相同的内容,它们将占用相同的大小。

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; }
};

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

于 2013-10-26T16:56:25.570 回答
1

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

对象通常被称为a或的实例。对象占用内存。占用的内存量取决于或实例化它的定义。 classstructstructclass

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

于 2013-10-26T18:38:06.387 回答
1

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

具体来说:

Bjarne Stroustrup 在“The C++ Programming Language”一书的第 10.2.8 节指出:

根据定义,结构是默认成员为公共的类;那是

struct s { ...  

只是简写

class s { public:...

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

如果基类没有访问说明符,public则在声明派生类时假定,并在声明structprivate时假定class

于 2013-10-26T18:03:18.870 回答