2013-09-21 16 views
11

AFAIK, il sizeof non deve restituire 0, ma il seguente programma:dimensione della classe con array vuoto in C++

#include <iostream> 

class A { 
public: 
    int a[0]; 
}; 

int main() { 
    A obj; 
    std::cout << sizeof(obj) << std::endl; 
} 

uscite 0. Perché?

+0

Perché ti aspetti che non sia "0"? – BartoszKP

+6

@BartoszKP Perché lo standard C++ lo impedisce. –

+1

@Dukeling No, il codice è illegale C++ comunque. –

risposta

13

C++ non consente array di dimensioni zero. Un compilatore conforme rifiuta il codice, ad es .:

$ g++-4.8 -pedantic-errors main.cpp 
main.cpp:5:14: error: ISO C++ forbids zero-size array 'a' [-Wpedantic] 
     int a[0]; 
      ^

Così il comportamento di sizeof qui non è semplicemente rilevante. GCC lo consente (senza -pedantic) come compiler extension.

+1

+1: Questo può essere trovato in 8.3.4§1: * "In una dichiarazione' TD [espressione costante] '[..] è presente l'espressione costante (5.19), deve essere un'espressione costante integrale e il suo valore deve essere maggiore di zero "*. – Zeta

+0

Qual è la dimensione di un oggetto di questa classe in GCC? Suppongo che sia la dimensione del puntatore. che cos'è? – hasan83

+0

@hasan Non ha senso discutere in quale caso un'implementazione difettosa dovrebbe tornare. La dimensione dell'array non dovrebbe essere 0 –