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();
È stato utile?

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:

  1. 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"

  2. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top