2010-02-17 4 views

ответ

8

Определения классов C++ не присваивают память. class - это как typedef и struct. Откуда у вас возникла идея, что «определение означает назначение памяти»? Можете ли вы предоставить цитату или ссылку?

C++ Создание объекта (через new) присваивает память.

+0

С книгу, он сказал, что заявление указывает тип данных и определение присваивает ему память – shreyasva

+0

Объявление _ данных data_ указывает тип данных, определение _ data_ присваивает ему память. Существуют и другие объявления и определения, такие как. – MSalters

+0

@ user265260: Не связывать объявление переменной с определением типа. 'class' подобен' typedef' и 'struct'. Это не похоже на объявление переменной. –

5

Определение класса скомпилировано в код. Этот код является частью образа процесса. Образ процесса загружается в оперативную память (и, следовательно, использует память) вашей операционной системой, но не является частью полезного пространства памяти вашего процесса.

Когда вы создаете объект своего класса, вы используете память в полезном пространстве памяти вашего процесса. «Полезное пространство памяти» состоит из памяти в одном из двух мест. The stack or the heap.

В определениях классов в стеке и куче не учитывается память. Когда вы создаете объект класса, он всегда будет идти либо в стек, либо в кучу.

+0

Есть больше мест, чем те 2. [GotW # 9] (http://www.gotw.ca/gotw/009.htm) перечисляет все 5. – MSalters

+0

@MSalters: Согласен, но для контекста этого вопроса я думаю, что это достаточно. А также я сказал полезное пространство памяти, поэтому многие вещи, упомянутые в ссылке, неприменимы. –

0

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

Class* test; 

Вышеупомянутое не будет выделять память, по умолчанию оно указывает на ничего.

Class test; 

Вышеуказанные будут полезными, но они будут иметь местный охват.

2

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

+0

Я думаю, что вы единственный, кто понял, что ОП неправильно понял! –

1

Это верно вплоть до точки. Все классы и столбцы на C/C++ имеют 2 места с «именами» в них.

Class <Name> 
{ 
    ... 
}<Vars>; 

Что вы делаете это определить <VARS> переменные класса < Название >. Все Варс будет иметь память, выделенную для них, но то, что вы обычно делаете, это опустит <VARS> части, и вы получите пустое определение переменных, как написание

int; 
0

Класса детали хранятся в таблице символов. В следующем коде:

#include<iostream> 
#include <typeinfo> 
using namespace std; 
class Base { 
public: 
    Base() { } 
    virtual void test(){ } 
}; 
class Derived: public Base { 
}; 

int main() { 
    // print Derived's info 
    Base* b = new Derived; 
    const char* str = typeid(*b).name(); 
    cout<<str<<"'s address = "<<hex<<"0x"<<(long)str<<endl; 

    // print Base's info 
    str = typeid(Base).name(); 
    cout<<str<<"'s address = "<<hex<<"0x"<<(long)str<<endl; 
    return 0; 
} 

скомпилировать этот файл с г ++ и запустить:

7Derived's address = 0x400e68 
4Base's address = 0x400e98 

Исполняемый файл "a.out", а также использовать «readelf -a а.из»команды, чтобы получить дополнительную информацию:.

Symbol table '.symtab' contains 98 entries: 
    Num: Value   Size Type Bind Vis  Ndx Name 
    ...... 
    79: 0000000000400e68  9 OBJECT WEAK DEFAULT 15 _ZTS7Derived 
    80: 0000000000400e98  6 OBJECT WEAK DEFAULT 15 _ZTS4Base 
    ...... 

Таким образом, определение класса занимает некоторую память, и эти данные могут быть доступны с помощью виртуальной таблицы