Question

  

Lorsque le compilateur a besoin de connaître la taille d'un C (classe)   objet: Par exemple, lors de l'attribution d'un   C sur la pile ou en tant que directement, tenue   membre d'un autre type

De C ++ Normes de codification: 101 règles, lignes directrices et les meilleures pratiques

Est-ce que cela signifie pour un objet alloué tas, la taille n'est pas nécessaire?

Class C;//just forward declaration
C * objc = new C();
Était-ce utile?

La solution

Pour répondre à votre question:

  

Est-ce que cela signifie pour tas alloué   la taille de l'objet n'est pas nécessaire?

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

C ++ ne vous laissera pas faire.

Même si elle pourrait vous permettre d'effectuer un « new » sur un type incomplet en résolvant par magie la taille plus tard (je pouvais imaginer ce qui est techniquement possible avec la coopération de l'éditeur de liens), la tentative échouera au moment de la compilation parce que d'au moins 2 raisons:

  1. new opérateur ne peut être utilisé avec des types complets. De la C ++ 98 norme 5.3.4 - "[la somme allouée] type doit être un type d'objet complet, mais pas un type de classe abstraite ou un tableau de celui-ci"

  2. le compilateur n'a aucune idée de ce que les constructeurs existent (et sont accessibles), il devrait également échouer pour cette raison.

Autres conseils

Non, cette liste est à titre d'exemple et non d'exclusion. Il est évident que la taille de l'objet doit être connu dans l'allocation tas de sorte que la bonne quantité de mémoire peut être allouée.

Taille de l'objet est calculée par l'opérateur new:

Object *o = new Object();

Vous n'avez pas besoin de dire explicitement new la taille de l'objet, mais il ne calcule (à l'aide de l'opérateur sizeof) afin d'attribuer la bonne quantité d'espace sur le tas.

En tant que programmeur, vous avez besoin presque jamais connaître la taille d'un objet en C ++. Par exemple:

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

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

Dans les deux cas est la connaissance de la taille nécessaire par le programmeur -. Le compilateur bien sûr besoin de le savoir

Notez que cependant vous créez un objet, sa taille doit être connue par le compilateur au moment de la création:

class B;     // forward declaration - no size:

void f() {
    B b;              // compilation error
    B * p = new B;    // compilation error
}

Non. Afin d'allouer un objet sur le tas, vous devez connaître la taille.

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

Le compilateur doit voir la déclaration de la classe pour deux raisons: il faut connaître la taille, il doit allouer (comme d'autres l'ont déjà souligné), mais aussi parce que le compilateur doit savoir comment construire l'objet: At-il un défaut constructeur, constructeur par défaut implicitement défini, aucun constructeur par défaut? Le compilateur doit savoir, même si l'objet peut être créé avec un pas de constructeur argument.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top