La taille d'un objet nécessaire pour créer objet sur tas?
-
09-09-2019 - |
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();
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:
-
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" -
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.