2015-06-16 1 views
6

Il linguaggio C++ consente di stampare il seguente codice, ad es. 1 invece di 16? Secondo altre risposte direi di sì, ma questo caso in particolare non sembra essere stato coperto.È possibile ottimizzare lo spazio di archiviazione per i riferimenti all'interno di una classe C++?

#include "iostream" 
#include "cstdlib" 
using namespace std; 

struct as_array { 
    double &a, &b; 

    as_array(double& A, double& B) 
     : a(A), b(B) {} 

    double& operator[](const int i) { 
     switch (i) { 
     case 0: 
      return this->a; 
      break; 
     case 1: 
      return this->b; 
      break; 
     default: 
      abort(); 
     } 
    } 
}; 

int main() { 
    cout << sizeof(as_array) << endl; 
} 
+0

* "ma questo caso in particolare non sembra essere stato coperto" * - che cosa pensi del tuo caso non era coperto? Solo che i riferimenti sono membri della classe? –

+1

Mi manca qualcosa? Poiché 'a' e' b' sono riferimenti indipendenti, in che modo il compilatore implementerà la struttura, oltre a allocare spazio per due puntatori? –

+0

> che cosa pensi del tuo caso non era coperto? sì è stato il fatto che i riferimenti sono membri della classe – user3493721

risposta

5

Lo Standard dice in [dcl.ref]:

Viene specificato se un riferimento richiede stoccaggio

Inoltre è fino al compilatore di decidere ciò che il la dimensione di un oggetto è, quindi è possibile ottenere qualsiasi numero diverso da zero qui.

Esiste anche la regola as-if (ovvero autorizzazione per l'ottimizzazione). Quindi sarebbe legale per il compilatore utilizzare la memoria per questi riferimenti se e solo se il modo in cui sono stati utilizzati i riferimenti lo richiedeva.

Detto questo; nell'interesse di avere un ABI stabile mi aspetterei comunque che un compilatore assegni lo storage a questi riferimenti.

2

Il modo in cui il compilatore implementa i comportamenti di riferimento, inclusi dove e come sono memorizzati, non è specificato nello standard C++. Di conseguenza, alcuni compilatori potrebbero "stampare per esempio 1 anziché 16" come richiesto.

Separatamente, non è necessario break dopo return ing.

2

credo che

cout << sizeof(as_array) << endl; 

restituisce sempre la memoria richiesta per due puntatori per raddoppiare sulla macchina dato, forse esteso con lacune per soddisfare le regole di imballaggio. Ottimizzare significava ridurre le dimensioni della memoria di determinate strutture dati. Invece il compilatore può ottimizzare completamente il tuo codice in uno scenario reale. Quindi, se avete il codice:

double a=100; 
double b=200; 
as_array arr(&a, &b); 
std::cout << arr[0] << std::endl; 

può portare a ottimizzare l'archiviazione per la struct via completamente, perché il compilatore sa come i valori vengono gestite tramite il codice. Ma la stampa di sizeof (arr) ti dà ancora le dimensioni teoriche della struttura.

In ogni caso: se si desidera ottimizzare l'ottimizzazione dei risultati, è necessario scrivere codice migliore! Crea metodi const se sono const! Se usi C++ 11 usa constexpr se possibile.

+1

Cosa ti porta a crederlo? – juanchopanza

+1

La definizione della struttura è in un primo passaggio indipendente dall'utilizzo. Quindi, se "chiedi" al compilatore le dimensioni teoriche, cosa dovrebbe essere ottimizzato in questo caso? Non c'è nulla che possa essere ottimizzato senza conoscere il caso d'uso. Non sono un avvocato linguistico, ma come dovrebbe la dimensione data ottimizzata senza sapere altro? – Klaus