Необходим ли размер объекта для создания объекта в куче?

StackOverflow https://stackoverflow.com/questions/949770

Вопрос

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

От Стандарты кодирования на C++:101 Правила, руководящие принципы и наилучшие практики

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

Class C;//just forward declaration
C * objc = new C();
Это было полезно?

Решение

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

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

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

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

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

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

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

Другие советы

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

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

Object *o = new Object();

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

Как программисту, вам почти никогда не нужно знать размер объекта в 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
}

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top