2013-10-26 3 views
-3

Всякий раз, когда мы создаем объект из класса, он создается на куче, занимающей больше места по сравнению с переменной struct, которая занимает свою память в стеке. Если я создаю класс 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(); 
} 

Пожалуйста, поправьте меня, если я ошибаюсь здесь об объектах и ​​ссылке,. Я хочу узнать из моего кода, что занимает больше места: Object или Struct?

+12

«Всякий раз, когда мы создаем объект из класса, он создается на куче» - неправильно. «занимая больше места по сравнению со структурной переменной» - неправильно.«который занимает свою память на стеке» - неправильно. Так неправильно. Вы явно не понимаете объекты вообще. Изучите еще несколько C++ и не беспокойтесь об использовании памяти. –

+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++ ни один из них не требует больше места, единственная разница по умолчанию - это количество членов по умолчанию! Посмотрите на ответ Маца Петтерсона. –

5

В С ++ struct и class точно то же самое в отношении того, как они распределены, и сколько места они занимают - основное отличие состоит в том, что по умолчанию для class является то, что данные являются частными, и вам нужно добавить public: для любой группы участников, которую вы хотите открыть вне класса, где struct имеет общедоступных участников по умолчанию, и если вы хотите иметь частных членов, вам нужно добавить private:.

Что-то выделяется в куче, стеке или в глобальной памяти полностью зависит от того, как написан код с использованием класса/структуры (например, вызов в new будет выделен в стеке, а не вызов new будет выделять либо глобальный пространство или в стеке), и совершенно не имеет значения, если объект является struct или 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; } 
}; 

(Компиляция кода который использует eit она из двух альтернативных форм, и было бы совершенно невозможно определить из двоичного кода, сгенерированного, является ли оно первым или вторым для)

1

Пожалуйста, имейте в виду, что в C++ структура и класс не являются разными типами вещи. Это то же самое, что и, с struct, являющимся синтаксическим сахаром для создания class с публичными участниками и методами и по умолчанию для общего наследования.

В частности:

Раздел 10.2.8 из книги «Язык программирования C++», Бьярне Страуструп утверждает:

По определению структура представляет собой класс, в котором члены являются общедоступными по умолчанию ; что

struct s { ... 

просто сокращание

class s { public:... 

И C++ Standard состояния (раздел 11.2, пункт 2):

В отсутствие доступа к-Специфическое эр для базовый класс, public - Предполагается, что если производный класс объявлен struct и private - предполагается, когда класс объявлен class.

+1

Это плюс наследование по умолчанию. – juanchopanza

+0

@juanchopanza правильный. Я уточню ответ. – Escualo

1

В дополнении к другим ответам, воспринимается struct и class являются трафаретами, рассказывающий компилятором , как организовано что-то. A struct и class не занимают никакой места в исполняемом файле, поскольку они используются только во время компиляции.

Объект обычно упоминается как экземпляр of class или struct. Объект занимает память. Объем занимаемой памяти зависит от определения struct или class, из которого он был создан.

Так что, отвечая на заголовок вашего вопроса, Which occupies more space: Object or Struct?, объект делает с struct, является только трафаретом, а объект является экземпляром.

+0

+1 для ответа на вопрос (нонсенс). Хотя 'struct' занимает больше символов в файле :) – juanchopanza

Смежные вопросы