什么占用更多空间:对象还是结构?

Muh*_*man -3 c c++ oop

每当我们从一个类创建一个对象时,它就会在堆上创建占用更多空间,而另一个结构变量占用堆栈上的内存.如果我创建一个Person类和一个具有相同属性的struct 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();  
}
Run Code Online (Sandbox Code Playgroud)

当我写这段代码时:

#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();  
}
Run Code Online (Sandbox Code Playgroud)

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

Kru*_*lur 5

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

C++,没有这样的差异,并且由实例化器决定是在堆还是堆栈上分配对象.例如

Person* person = new Person(45);
Run Code Online (Sandbox Code Playgroud)

Person在堆上分配实例,而

Person person(45);
Run Code Online (Sandbox Code Playgroud)

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

另外,通常没有什么能支持"在堆上创建占用更多空间的语句,而不是占用堆栈内存的结构变量".通常情况下,堆分配带来一些开销(内存和处理时间),但堆栈空间通常更加有限(通常每个线程的堆栈大小固定).

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


Mat*_*son 5

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

无论是在堆上,堆栈上还是在全局内存中分配了某些内容,都完全取决于如何编写使用类/结构的代码(例如,调用new将在堆栈上分配,而不是调用new将分配全局空间或堆栈如果对象是a struct或a class,则它们完全没有区别- 如果它们具有相同的内容,它们会占用相同的大小.

OFTEN struct是当结构中的数据是"纯数据"并且没有构造函数或成员函数时使用的约定,其中在class涉及成员函数和/或构造函数时使用.然而,这是一个惯例,并且在以下方面绝对没有技术差异:

 struct Coord3D
 {
    float x, y, z;
 };
Run Code Online (Sandbox Code Playgroud)

 class Coord3D
 {
    public:
      float x, y, z;
 };
Run Code Online (Sandbox Code Playgroud)

或之间

struct Person
{
  private:
     int age; 
     std::string name;
  public:
     int getAge() { return age; }
     std::string getName() { return name; }
};
Run Code Online (Sandbox Code Playgroud)

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; }
};
Run Code Online (Sandbox Code Playgroud)

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