Newsgroup: it.comp.lang.c++
Titolo: Static const e allocazione in segmento dati

Ho un piccolo dubbio che mi assilla sull''uso delle costanti membro
statiche...
Vorrei associare ad una classe alcune costanti intere; da zelante
studentello C++ :-) preferivo usare 'const' piuttosto che #define per
sfruttare il controllo sui tipi.
Sto scrivendo un'applicazione embedded, per cui presto abbastanza
attenzione al codice generato dal
compilatore, soprattutto riguardo l'occupazione di RAM. Uso il Borland
C++ 5.02, 16 bit, modello large.
Non capisco come mai una costante globale non occupi alcuna locazione di
RAM, come invece
accade se definita come membro statico. Oltretutto viene marchiata
"extrn"... non capisco..
C'e' qualcosa che mi sfugge, credo... mi piacerebbe sentire il parere di
qualcuno con piu' esperienza di me.
Per esempio:
const int extConst = 0xAA;    // questa non viene allocata in segmento
DATA; codificata come "immediate"
class foo {
public:
 static const memberConst = 0x55;    // questa mi va a finire in RAM!
 foo() : data1_(extConst), data2_(memberConst) {};
   int data1_;
   int data2_;
};
foo myFoo;
Compilandolo risulta (ho potato piu' che potevo):
DGROUP group _DATA,_BSS
 assume cs:PROVA_TEXT,ds:DGROUP
_DATA segment word public 'DATA'
d@ label byte
d@w label word
_DATA ends
_BSS segment word public 'BSS'
b@ label byte
b@w label word
_BSS ends
_DATA segment word public 'DATA'
@foo@memberConst label word                    <-------------- ???????
perche' ??
 db 85
 db 0
_DATA ends
_BSS segment word public 'BSS'
_myFoo label word
 db 4 dup (?)
_BSS ends
[...]
@1@3:
 mov word ptr DGROUP:_myFoo,170                        <---- questa
costante e' codificata in "immediate mode"
 mov ax,word ptr DGROUP:@foo@memberConst      <---- l'altra e'
chiaramente in DGROUP:DATA.
 mov word ptr DGROUP:_myFoo+2,ax
 pop di
 pop si
 ret
[...]
 extrn @foo@memberConst:word                                <--- perche'
EXTRN ??
public _myFoo

Penso che nel caso di
    static const int a
il compilatore dichari una variabile statica che occupa quindi memoria e poi
gli appiccica l'attributo const che non ti permette eventualmente di
modificarla.
Non so a livello di standard cosa sia corretto.
Ma scusa la domanda: a cosa servirebbe 'static const'?
Ciao.
--
Antonio Donatiello


Dichiarando, all' interno di una classe un ELEMENTO di DATI static tu
dichiari una VARIABILE GLOBALE per quella classe a cui é associata una
particolare gestione dei nomi da parte del compilatore;
Di più, un elemento di dati statico é condiviso tra tutte le istanze  di
quella classe ecc... ed ovviamente allocato in modo indipendente dal
puntatore this ( non sapresti a quale this riferirti !!! )
A questo punto tu dici al compilatore: guarda che quell' elemento di dati
NON é modificabile nell' ambito di alcuna istanza di oggetti di quella
classe ... e basta.
Dunque, essendo l' oggetto così dichiarato una variabile, é ovvio che debba
essere allocato in un segmento dati.
Direi quindi che non puoi parlare di "costanti membro".
Dichiarando invece una costante simbolica cioé:
const   short   sh_MiaConst = 0x0085;
non credo che il compilatore, per standard, sia tenuto ad allocare un
segmento CONST piuttosto che generare una sequenza di codice; probabilmente
dipende dalla implementazione;
In ogni caso fai molto bene a verificare l' assembler generato per essere
sicuro di esserti bene espresso e che Lui abbia ben capito.
Comunque, se stai contando i byte, forse il C++ é comunque un po' più
pesante di quanto non sarebbe un buon ANSI C.
In altre parole, se scrivi codice x un 186 non so se C++ sia "la morte sua".
Ciao
Mat