Supponiamo che ho bisogno di chiamare una funzione foo
che prende un const std::string
riferimento da un gran numero di posti nel mio codice:Macro per std :: statico oggetto stringa da letterale
int foo(const std::string&);
..
foo("bar");
..
foo("baz");
chiamare una funzione con una stringa letterale come questo creerà oggetti temporanei std::string
, copiando ogni volta il letterale.
A meno che non mi sbagli, i compilatori non ottimizzeranno questo creando un oggetto statico std::string
che può essere riutilizzato per le chiamate successive. So che g ++ ha meccanismi avanzati di pool di stringhe, ma non penso che si estenda agli stessi oggetti std::string
.
posso fare questo "ottimizzazione" me stesso, il che rende il codice un po 'meno leggibile:
static std::string bar_string("bar");
foo(bar_string);
..
static std::string baz_string("baz");
foo(baz_string);
Utilizzando Callgrind, posso confermare che questo effettivamente accelerare il mio programma.
Ho pensato di provare a creare una macro per questo, ma non so se è possibile. Quello che vorrei è qualcosa di simile:
foo(STATIC_STRING("bar"));
..
foo(STATIC_STRING("baz"));
Ho cercato di creare un modello con la letterale come un parametro di template, ma che si è rivelato impossibile. E poiché una definizione di funzione in un blocco di codice non è possibile, sono completamente privo di idee.
C'è un modo elegante per farlo, o dovrò ricorrere alla soluzione meno leggibile?
Utilizzare char * invece? – ZivS
Quindi, per quanto riguarda '[]() -> std :: string const & {std :: string const s (" bar "); ritorna; }() '? – dyp
con C++ 14, è possibile utilizzare "bar" letterali definiti dall'utente 's, ma non sono sicuro che faccia una copia o meno –