2011-12-15 15 views
9

Mi stavo chiedendo quale sia il limite di dimensione per una classe. Ho fatto un semplice test:Qual è il limite di dimensioni per una classe?

#define CLS(name,other) \ 
class name\ 
{\ 
public: \ 
name() {};\ 
    other a;\ 
    other b;\ 
    other c;\ 
    other d;\ 
    other e;\ 
    other f;\ 
    other g;\ 
    other h;\ 
    other i;\ 
    other j;\ 
    other k;\ 
}; 

class A{ 
    int k; 
public: 
    A(){}; 
}; 

CLS(B,A); 
CLS(C,B); 
CLS(D,C); 
CLS(E,D); 
CLS(F,E); 
CLS(G,F); 
CLS(H,G); 
CLS(I,H); 
CLS(J,I); 

Non riesce a compilare con

" 'J': classe è troppo grande"

Se rimuovo la dichiarazione finale - CLS(J,I);, è tutto va bene.

È una restrizione imposta dal compilatore o si trova da qualche parte nello standard?

+0

Con l'ultima definizione si raggiunge circa 10 GB (a seconda del padding) per la classe J. – dalle

+0

Lo stavo solo dichiarando, non effettivamente usandolo.Scommetto che dichiarare un array di alcune classi H potrebbe interrompere il runtime :) –

risposta

14

In C++ 11 questo è allegato B. Implementazioni può imporre limiti, ma dovrebbero essere almeno:

  • dimensione di un oggetto [262 144].
  • Membri dati in una singola classe [16 384].
  • Membri dichiarati in una singola classe [4 096].

Il terzo non è direttamente rilevante per il tipo di costruzione si sta utilizzando, lo cito solo perché indica che il secondo è davvero il totale membri, presumibilmente compresi quelli nelle basi e io Non sono sicuro dei membri dei membri. Ma non si tratta solo dei membri elencati in una singola definizione di classe.

L'implementazione sembra aver rinunciato a 2^31 membri di dati o alla dimensione 2^32, poiché accetta I ma non J. È abbastanza ovvio che un compilatore rifiuti di considerare classi con dimensioni superiori a SIZE_MAX, anche se il programma non esegue l'istanziazione o utilizza sizeof nel tipo. Quindi, anche con il miglior sforzo possibile da parte del compilatore, non mi aspetterei mai che funzioni su un'implementazione a 32 bit.

Si noti che "queste quantità sono solo linee guida e non determinano la conformità", quindi un'implicazione conforme può imporre un limite inferiore arbitrario anche quando dispone di risorse sufficienti per compilare un programma che utilizza numeri più grandi. Non c'è un limite minimo per la conformità.

Esistono varie opportunità nello standard C++ per rendere inutile un'implementazione conforme a causa di limiti di risorse ridicolmente bassi, quindi non c'è alcun danno aggiuntivo se questo è un altro.

C++ 03 è più o meno lo stesso:

  • dimensione di un oggetto [262 144].
  • Membri dati in una singola classe, struttura o unione [16 384].
  • Membri dichiarati in una singola classe [4 096].
+0

Perfetto, grazie. –

+0

@Steve Jessop. Si noti che l'Allegato B non è normativo --- i valori indicati sono minimi raccomandati, e che in effetti sarei molto sorpreso se un sistema a 16 bit supportasse una classe con una dimensione superiore a 65565. –

+0

@James: sì, L'ho notato. Buon punto a 16 bit, ci si aspetterebbe che 'SIZE_MAX' sia inferiore al limite consigliato. –

0

Sono sicuro che il suo compilatore dipende. Puoi eseguire il compilatore in modalità solo pre-elaborazione per vedere quale è l'output generato se sei curioso. Potresti anche voler esaminare l'espansione dei modelli piuttosto che i macro.

+0

Questa era solo una pura domanda teorica, ecco perché sto usando macro. Perché dovrei aver bisogno di modelli? Inoltre, se è specifico del compilatore, è necessario menzionare un limite minimo nello standard. Questo è il tipo di risposta che stavo cercando. –

Problemi correlati