Newsgroup: it.comp.lang.c++
Titolo: inline functions with static data

Premessa: il Meyer's Singleton (More Effective C++) è molto utile
perchè sfrutta gli atexit inseriti automaticamente dal compilatore per
il destroy dell'oggetto. Questo permette di avere un controllo più
preciso dell'ordine di distruzione dei singleton (inverso a quello in
qui, al run-time, sono stati creati). Esempio:
Printer& thePrinter ()
{
 static Printer p;
 return p;
}
ok, fine del ripassino ;-)
veniamo al mio dubbio
voi cosa ne dite della possibilità di definire la funzione inline
direttamente nell'header?
posso contare sul fatto che i dati statici sono comunque unici (ossia
c'è un external linkage), altrimenti finisco per trovarmi con
singleton ... multipli!
Il mio obiettivo ultimo sarebbe poter scrivere una cosa del genere:
template<class T>
T& SingletonContainer ()
{
 static T t;
 return t;
}
cosa ne dite?
saluti,
Marco
tra l'altro ho trovato che in MSVC esiste __declspec(noinline)
... ma, ovviamente, non vorrei usare tricks proprietari

 }
Ma quella non e' una funzione inline. Questa invece lo e'
template<class T>
inline T& SingletonContainer ()
{
 static T t;
 return t;
}
In ogni caso, ci sara' una funzione sola creata dal compilatore per ogni 
type usato come il template parameter, quindi ci sara' una variabile sola 
per ogni istanza di SingleContainer<>. Comunque, credo che alcuni vecchi 
compilatori abbiano problemi con le variabili static nelle funzioni inline.

 compilatori abbiano problemi con le variabili static nelle funzioni inline.
quindi con il VC8 dovrei essere tranquillo...

 inlinedirettamente nell'header?
Credo la risposta sia nascosta qui dentro, io onestamente son
restatocol dubbio anche dopo aver letto i due thread a suo tempo.
<
http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/t
hread/4fe416293373e9d6/add5b233905a9d0a>
<
http://groups.google.co.uk/group/comp.std.c++/browse_thread/thread/450
c9fadcb2c7923/72e210d8d497dad2>
--
Marco
 
-- 
I'm trying a new usenet client for Mac, Nemo OS X.
You can download it at 
http://www.malcom-mac.com/nemo

 c9fadcb2c7923/72e210d8d497dad2>
proverò a leggermeli
grazie pan
ciao,
Marco

 direttamente nell'header?
A mio avviso non dovrebbe essere possibile. Infatti come fa il 
compilatore a scegliere in quale unita' di traduzione inserire il 
simbolo per la variabile statica? Questo compito non puo' essere 
lasciato al linker, che potrebbe non avere abbastanza informazioni per 
farlo.
Comunque perche' non fai una prova e ci fai sapere?
E.

 Comunque perche' non fai una prova e ci fai sapere?
...ho provato io e... funziona! ...non me ne capacito, evidentemente 
c'e' qualcosa della fase di linking del C++ che non mi e' chiara. 
Immagino che il compilatore generi il codice per la funzione in tutte le 
unita' di traduzione, e poi in fase di linking venga controllato che il 
codice sia identico e vengono eliminati i doppioni.
E.

 doppioni.
Se si tratta di UB, una prova non basta.


 Se si tratta di UB, una prova non basta.
scusa l'ignoranza, cosa intendi per UB? "Unexpected Behavior"?
forse intendi che in un ragionamento generale, o a livello di
principio, una prova non basta?

 diprincipio, una prova non basta?
Se e' un'area grigia, provare su uno o N-mila compilatori e'
inutile, dato che potra' sempre esistere un compilatore che
interpretadiversamente il "comportamento non definito".
Ciao,


 quindi con il VC8 dovrei essere tranquillo...
Comunque devi fare attenzione. Se per qualche ragione il compilatore non 
riesce a creare la funzione inline in qualche translation unit, in ogni 
translation unit per cui non ci e' riuscito ci sara' una versione 
indipendente della funzione, con le proprie variabile statiche e tutto. 
Questo problema non esiste per le funzioni inline delle classe, quindi e' 
meglio non usare le variabili statiche locali nelle non member funzioni 
inline