Нужен ли размер объекта для создания объекта в куче? - PullRequest
1 голос
/ 04 июня 2009

Когда компилятору нужно знать размер C (класс) объект: например, при выделении С в стеке или в качестве прямого член другого типа

Из Стандарты кодирования C ++: 101 правила, руководящие указания и рекомендации

Означает ли это, что для объекта, выделенного в куче, размер не требуется?

Class C;//just forward declaration
C * objc = new C();

Ответы [ 6 ]

5 голосов
/ 04 июня 2009

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

3 голосов
/ 05 июня 2009

Чтобы ответить на ваш конкретный вопрос:

Означает ли это для выделенной кучи размер объекта не нужен?

Class C;//just forward declaration
C * objc = new C();

C ++ не позволит вам сделать это.

Даже если это может позволить вам выполнить 'new' для неполного типа, волшебным образом разрешив размер позже (я мог бы предположить, что это технически возможно при сотрудничестве с компоновщиком), попытка не удастся компилировать время по крайней мере по двум причинам:

  1. оператор new может использоваться только с полными типами. Из стандарта C ++ 98 5.3.4 - «[выделенный] тип должен быть полным типом объекта, но не абстрактным типом класса или его массивом»

  2. компилятор не имеет представления о том, какие конструкторы существуют (и доступны), поэтому по этой причине он также может потерпеть неудачу.

2 голосов
/ 04 июня 2009

Как программист, вам почти никогда не нужно знать размер объекта в C ++. Например:

class A {
    ...  // member data
};

void f() {
    A a;              // allocate on stack
    A * p = new A;    // allocate on heap
}

Ни в том, ни в другом случае не требуется знания размера, необходимого программисту - конечно, компилятор должен это знать.

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

class B;     // forward declaration - no size:

void f() {
    B b;              // compilation error
    B * p = new B;    // compilation error
}
2 голосов
/ 04 июня 2009

Размер объекта вычисляется оператором new:

Object *o = new Object();

Вам не нужно явно указывать new размер объекта, но он вычисляет его (используя оператор sizeof), чтобы выделить правильный объем пространства в куче.

0 голосов
/ 04 июня 2009

Компилятор должен видеть объявление класса по двум причинам: он должен знать размер, который он должен выделить (как уже указывали другие), а также потому, что компилятор должен знать, как создать объект: имеет ли он значение по умолчанию конструктор, неявно определенный конструктор по умолчанию, нет конструктора по умолчанию? Компилятор должен знать, даже если объект может быть создан с помощью конструктора без аргументов.

0 голосов
/ 04 июня 2009

Нет. Чтобы выделить объект в куче, вы должны знать размер.

Foo *foo=(Foo *)malloc(sizeof(*foo));
...