2015-12-18 23 views
6

Da the manual:Quali sono le implicazioni dell'uso di _GLIBCXX_CXX11_ABI per utilizzare l'ABI pre-5.1 C++ con le caratteristiche di C++ 11/14?

Nella versione 5.1 di GCC libstdC++ ha introdotto una nuova libreria ABI che include nuove implementazioni di std :: string e std :: list. Queste modifiche erano necessarie per conformarsi allo standard C++ del 2011 che proibisce le stringhe Copy-On-Write e richiede liste per tenere traccia delle loro dimensioni.

È possibile utilizzare la macro _GLIBCXX_USE_CXX11_ABI per controllare whter le intestazioni di libreria usa il vecchio o il nuovo ABI, indipendentemente da quale "-std" viene utilizzato.

Mi piacerebbe sapere quali sarebbero le implicazioni dell'utilizzo di questa "compatibilità ABI"? Immagino che le prestazioni in fase di esecuzione delle operazioni su piccole stringhe saranno influenzate (suppongo negativamente), e che l'accesso alla dimensione dell'elenco va da O (1) (C11 ABI) a O (N) (compatibilità ABI).

  1. Le mie ipotesi sono corrette e qualcuno può elaborare?
  2. Ci sono altre implicazioni che mi sono sfuggite? E riguardo le caratteristiche di atomica e di concorrenza? Qualche impatto?
+0

Quando si dice "C" vuol dire "O (1)"? –

+0

Credo di si. Intendo il tempo costante. – Spacemoose

+1

Penso che il modo più semplice sarebbe quello di passare attraverso le intestazioni, non ci sono così tante occorrenze di _GLIBCXX_USE_CXX11_ABI. –

risposta

1

tua prima domanda è in realtà risposto il manuale stesso:

... la scelta di ABI di utilizzare è indipendente l'opzione -std utilizzato per compilare il codice ... In questo modo che il -std non modifica l'ABI, in modo che sia semplice collegare il codice C++ 03 e C++ 11 insieme.

Per quanto riguarda la seconda domanda, temo che sia difficile generalizzare l'impatto perché dipende da come il codice utilizza la libreria standard. Copia molto le stringhe? Con quale frequenza viene interrogata una dimensione elenco? Il codice è multi-thread?

Sebbene l'atomica e la concorrenza siano state introdotte nello standard C++ 11, suppongo che il meccanismo di copia-su-scrittura stdlib ++ abbia comunque utilizzato una variazione di esso. Tali implementazioni sono generalmente thread-safe.

Forse una cosa che non ha citato direttamente è l'impatto sulle altre componenti std che dipendono da quei comportamenti, come ad esempio list::splice