2013-10-26 26 views
-3

每当我们从一个类创建一个对象时,它就会占用更多空间的堆上创建,而堆栈中占用其内存的结构变量则会占用更多空间。如果我创建一个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(); 
} 

当我写这篇文章的代码:

#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(); 
} 

请纠正我,如果我错了,这里有关对象和refernces。我想从我的代码知道什么占据更多的空间:对象或结构?

+12

“每当我们从类创建一个对象,它是在堆上创建”。 “与结构变量相比,占用更多空间” - 错误。“在堆栈上占据了内存” - 错误。大错特错。你显然根本不理解物体。了解更多C++,不用担心内存使用情况。 – 2013-10-26 16:49:09

+1

非常感谢。感谢您的评论。 –

回答

5

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

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

Person* person = new Person(45); 

分配堆上的Person例如,虽然

Person person(45); 

分配堆栈上的相似实例。

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

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

+0

好。为什么我们需要这样做? C++中的哪一个占用更多的空间。请纠正我。谢谢 –

+1

我不确定我是否理解“为什么”部分。希望我的更新答案能回答你评论的第二部分? – Krumelur

+0

@MuhammadMaqsoodurRehman在C++中,它们都不需要更多空间,唯一的区别是成员的默认范围!看看Mats Petterson的回答。 –

5

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

之间(编译代码使用eit她的两个替代形式,它会从生成的二进制代码,无论是第一或第二的)

1

请记住,C++中的结构和类都没有不同的是完全不可能告诉的东西。它们是相同的东西struct句法糖用于创建带有公共成员和方法的class,并且默认为公共继承。

具体来说:

书 “的C++程序设计语言” 的章节10.2.8,Bjarne的Stroustrup的规定:

通过定义一个结构是其中成员是公共由 默认的类;即

struct s { ... 

是简单地简写

class s { public:... 

C++ Standard状态(第11.2节,第2项):

在没有访问SPECI音响ER的一基类,public是 假定当派生的类声明structprivate是0123当类声明为class时假定为。

+1

那加上默认继承。 – juanchopanza

+0

@juanchopanza正确。我会澄清答案。 – Escualo

1

除了其他的答案,一个structclass是模板告诉编译器东西是如何组织的。因为它们在编译过程中只用了一个structclass不占用在执行任何房间。

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

因此,在回答你的问题,Which occupies more space: Object or Struct?的标题,对象不会因为struct只是一个模板和对象实例化。错了 -

+0

+1用于回答(无意义的)问题。尽管'struct'在文件中占用更多字符:) – juanchopanza

相关问题