È la dimensione di un oggetto necessario per la creazione di oggetti sul mucchio?
-
09-09-2019 - |
Domanda
Quando compilatore bisogno di conoscere le dimensioni di una C (classe) oggetto: Ad esempio, per allocare un C sulla pila o come direttamente detenuti membro di un altro tipo
Da C ++ norme di codifica: 101 regole, linee guida e best practice
Questo significa che per un oggetto heap allocata, la dimensione non è necessario?
Class C;//just forward declaration
C * objc = new C();
Soluzione
Per rispondere alla tua domanda specifica:
Questo significa che per heap allocata dimensioni dell'oggetto non è necessario?
Class C;//just forward declaration C * objc = new C();
C ++ non ti consente di farlo.
Anche se potrebbe consentono di eseguire un 'new
' su un tipo incompleto dal magicamente risolvere il formato in un secondo momento (ho potuto immaginare questo essere tecnicamente possibile con una collaborazione da parte del linker), il tentativo fallirà al momento della compilazione perché di almeno 2 motivi:
-
operatore
new
può essere utilizzato solo con i tipi completi. Dalla C ++ 98 Standard 5.3.4 - "[allocato] tipo deve essere un tipo di oggetto completo, ma non un tipo di classe astratta o matrice stessa" -
il compilatore ha idea di cosa esistono costruttori (e sono accessibili), quindi sarebbe anche fallire per questo motivo.
Altri suggerimenti
No, questa lista è a titolo esemplificativo e non di esclusione. Ovviamente le dimensioni dell'oggetto deve essere noto allocazione mucchio così la giusta quantità di memoria può essere allocata.
L'oggetto viene calcolata dall'operatore new
:
Object *o = new Object();
Non è necessario dire esplicitamente new
le dimensioni dell'oggetto, ma lo fa calcolarlo (tramite operatore sizeof
) al fine di allocare la giusta quantità di spazio sul mucchio.
Come programmatore, è quasi mai bisogno di conoscere le dimensioni di un oggetto in C ++. Ad esempio:
class A {
... // member data
};
void f() {
A a; // allocate on stack
A * p = new A; // allocate on heap
}
In entrambi i casi è la conoscenza della dimensione necessaria dal programmatore -. Il compilatore, naturalmente, ha bisogno di sapere che
Si noti che comunque si crea un oggetto, la sua dimensione deve essere conosciuto dal compilatore al momento della creazione:
class B; // forward declaration - no size:
void f() {
B b; // compilation error
B * p = new B; // compilation error
}
No. Al fine di allocare un oggetto sul mucchio, è necessario conoscere la dimensione.
Foo *foo=(Foo *)malloc(sizeof(*foo));
Il compilatore deve vedere la dichiarazione della classe per due motivi: deve conoscere la dimensione che deve allocare (come altri hanno già fatto notare), ma anche perché il compilatore deve saper costruire l'oggetto: Ha un difetto costruttore, implicitamente definito costruttore predefinito, nessun costruttore di default? Il compilatore deve sapere anche se l'oggetto può essere creato con un costruttore senza argomenti.