Если определение предназначено для назначения памяти. Почему определение класса в C++ не имеет памяти, если экземпляр объекта создается.Определение класса и распределение памяти
ответ
Определения классов C++ не присваивают память. class
- это как typedef
и struct
. Откуда у вас возникла идея, что «определение означает назначение памяти»? Можете ли вы предоставить цитату или ссылку?
C++ Создание объекта (через new
) присваивает память.
Определение класса скомпилировано в код. Этот код является частью образа процесса. Образ процесса загружается в оперативную память (и, следовательно, использует память) вашей операционной системой, но не является частью полезного пространства памяти вашего процесса.
Когда вы создаете объект своего класса, вы используете память в полезном пространстве памяти вашего процесса. «Полезное пространство памяти» состоит из памяти в одном из двух мест. The stack or the heap.
В определениях классов в стеке и куче не учитывается память. Когда вы создаете объект класса, он всегда будет идти либо в стек, либо в кучу.
Есть больше мест, чем те 2. [GotW # 9] (http://www.gotw.ca/gotw/009.htm) перечисляет все 5. – MSalters
@MSalters: Согласен, но для контекста этого вопроса я думаю, что это достаточно. А также я сказал полезное пространство памяти, поэтому многие вещи, упомянутые в ссылке, неприменимы. –
Если вы определяете как указатель на класс, C++ не выделяет память автоматически объекту. В C++ управление памятью должно выполняться в вашем коде, который имеет преимущества и недостатки в зависимости от варианта использования вашего приложения.
Class* test;
Вышеупомянутое не будет выделять память, по умолчанию оно указывает на ничего.
Class test;
Вышеуказанные будут полезными, но они будут иметь местный охват.
Объявление класса сообщает компилятору и времени выполнения , сколько памяти выделить для каждого экземпляра класса, но только по запросу. Определение класса создает исполняемый код для поведения класса.
Я думаю, что вы единственный, кто понял, что ОП неправильно понял! –
Это верно вплоть до точки. Все классы и столбцы на C/C++ имеют 2 места с «именами» в них.
Class <Name>
{
...
}<Vars>;
Что вы делаете это определить <VARS> переменные класса < Название >. Все Варс будет иметь память, выделенную для них, но то, что вы обычно делаете, это опустит <VARS> части, и вы получите пустое определение переменных, как написание
int;
Класса детали хранятся в таблице символов. В следующем коде:
#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
......
Таким образом, определение класса занимает некоторую память, и эти данные могут быть доступны с помощью виртуальной таблицы
С книгу, он сказал, что заявление указывает тип данных и определение присваивает ему память – shreyasva
Объявление _ данных data_ указывает тип данных, определение _ data_ присваивает ему память. Существуют и другие объявления и определения, такие как. – MSalters
@ user265260: Не связывать объявление переменной с определением типа. 'class' подобен' typedef' и 'struct'. Это не похоже на объявление переменной. –