2016-07-18 96 views
8

L'inizializzazione di aggregazione inizializza i membri dati di un oggetto classe aggrete, mentre l'inizializzazione del valore di un aggregato lo inizializzerà per la prima volta che azzera anche i byte di riempimento, come mostrato dal seguente spec preventivoValore aggregato rispetto all'inizializzazione di un oggetto di classe aggregato con padding

se T è un gruppo (possibilmente cv-qualificato) mancata unione tipo di classe, ciascun membro dati non statico ed ogni sotto-oggetto classe base è zero-inizializzato e imbottitura è inizializzato a zero bit;

Questo significa che generalmente si dovrebbe evitare l'inizializzazione struct aggregati utilizzando () e preferiscono {} invece perché quest'ultimo non deve garantire che bit di riempimento sono pari a zero?

Se la risposta a quanto sopra è "no", ci sono casi in cui le implementazioni non riempiono il riempimento con {} ma fanno con ()? E tra questi casi, qual è la scelta migliore da utilizzare per il programmatore?

+0

[Clang] (http://coliru.stacked-crooked.com/a/e30e266d90c16662) rispetta la regola, mentre [gcc] (http://coliru.stacked-crooked.com/a/eff8609fc153d914) e MSVC azzera ancora i byte di riempimento nel mio test. – Jamboree

risposta

1

No. In primo luogo, sospetto che la maggior parte dei compilatori in realtà valuterà l'inizializzazione di un aggregato (dati argomenti costanti) con un valore singolo (padding incluso) in ogni caso.

Tuttavia, la ragione importante perché no, è che questo tipo di micro-ottimizzazione dovrebbe essere lasciato fino a quando non si hanno misurazioni che mostrano che c'è un problema (e scommetto che non otterrete mai quelle misure). Nel frattempo, scrivi quello che è il più chiaro.

+0

Grazie. La mia domanda viene aggiornata di conseguenza. Perché hai limitato il tuo impegno agli aggregati di membri singoli? Le implementazioni si comportano in modo diverso se le strutture contengono multiple.members con il padding eventualmente più inter-membro? –

+0

Non intendevo solo aggregati a membro singolo. Mi aspetterei che 'struct A {char c; pantaloncini; long long ll}; 'per essere inizializzato con un singolo valore 128 o 256-bit (dati argomenti costanti), non tre valori separati. –