Domanda

Probabilmente si tratta di ridondanza di programmazione abituale. Ho notato DECLSPEC_NOVTABLE (__declspec (novtable)) su una serie di interfacce definite nelle intestazioni:

struct DECLSPEC_NOVTABLE IStuff : public IObject
{
    virtual method1 () = 0;
    virtual method2 () = 0;
};

articolo MSDN su questo __declspec l'attributo esteso dice che l'aggiunta di questo tipo rimuoverà le voci vtable costrutto e descrittore e quindi si tradurrà in "significativa riduzione della dimensione del codice" (perché la vtable verrà rimossa interamente).

Questo non ha molto senso per me. Questi ragazzi sono puramente virtuali, perché il compilatore non dovrebbe farlo per impostazione predefinita?

L'articolo dice anche che se lo fai, e quindi prova a creare un'istanza di una di queste cose, otterrai una violazione di accesso al tempo di esecuzione. Ma quando l'ho provato con alcuni compilatori (con o senza l'estensione __declspec), non vengono compilati (come mi sarei aspettato).

Quindi immagino di riassumere:

  • Il compilatore elimina la vtable indipendentemente dalle interfacce virtuali pure o ho perso qualcosa di fondamentale qui?
  • Di cosa parla l'articolo MSDN?
È stato utile?

Soluzione

Il compilatore elimina il unico riferimento alla vtable, che sarebbe stato durante la costruzione della classe. Pertanto, il linker può ottimizzarlo via poiché non vi è più un riferimento nel codice.

Inoltre, ho preso l'abitudine di dichiarare un costruttore vuoto come protetto , e anche di usare l'estensione abstract di Microsoft, per evitare tale violazione di accesso in fase di esecuzione . In questo modo, il compilatore rileva invece il problema al momento della compilazione (poiché solo una classe base può istanziare l'interfaccia tramite il costruttore protetto). Naturalmente la classe derivata compilerà la tabella durante la sua costruzione

Altri suggerimenti

È un po 'complicato per un compilatore / linker stupido. Il compilatore non deve inserire alcun riferimento a questa vtable, poiché è abbastanza ovvio che non è necessario per questa vtable. Il compilatore potrebbe anche contrassegnare il riferimento in modo tale che il linker possa eliminare la vtable, ma questo è ovviamente più complesso.

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