2013-10-26 53 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

相關問題