Newsgroup: it.comp.lang.c++
Titolo: appena cominciato ma...

oggi ho creato il mio primo programma in c++ con dev c++.....doveva solo
scrivere "prova" sullo schermo...tutto č andato bene ma mi č rimasto un
dubbio: possibile che per un programmino cosě inutile sia uscito un
eseguibile di piů di 400Kb.....boh? č normale??
-- 
------------------------------------------------------------
Fabio Cometti
Handle: sys64738
Keyserver: ldap://
europe.keys.pgp.com:11370
Finger print: 0F39 9999 D7AB DBBC D2AE  AB77 30F5 DB26 263E 56CC
ICQ number: 215-386-616
------------------------------------------------------------

Perchè lo hai fatto con il codice di debug. Prova a dirgli di farlo in
modalità Release (o senza codice di Debug), ti si ridurrà parecchio... E cmq
è scritto nelle FAQ del C/C++ (non mi ricordo in quali)
http://www.parashift.com/c++-faq-lite/compiler-dependencies.html#faq-37.10
--- bye

Ciao, non sono un mega esperto ma direi che il problema non č il C++, e
neanche il compilatore.
Piuttosto direi che sono i programmi per Windows che necessitano d'avere
linkato un sacco di roba.
Sotto Linux hello world č pochi Kb, una decina.
Possono esserci comunque accortezze per ridurre il piů possibile le
dimensioni del codice, le piů ovvie che mi vengono in mente sono togliere i
simboli per il debugging, usare opzioni come -fno-exceptions (spero di
ricordare bene) e -fno-rtti. E usare l'ottimizzazione (anche se a volte, a
scapito delle performances le dimensioni aumentano).

 linkato un sacco di roba.
Diresti male :-)
Sono dll, mica librerie statiche.
Ciao, Spider

 Ciao, Spider
Ciao, non capisco perň come mai lo stesso programma helloworld compilato
sotto linux č 10K mentre con Windows č sempre molto di piů (con tutti i
compilatori che ho provato)... hai una risposta per questo? A te quanto
viene con Windows?

 viene con Windows?
Dipende dall'incapacità dei programmatori, come per tutte le cose :-)
Scherzo (o forse no)... Cmq ho fatto un'indagine.
Innanzitutto stiamo attenti a non confondere pizza e fichi. Usiamo il VC++,
opzioni Release, CRT linkato staticamente!
1) printf "Hello World\n": 36kb
2) cout "Hello World\n": 68kb
3) WriteConsole "Hello World\n": 22kb
4) programma standard vuoto x windows creato da VC++ (main window + barra
menu + finestra about, a cui abbiamo tolto le due icone standard da 20kb
l'una): 24kb
5) programma che visualizza MessageBox "Hello World": 22,5kb
Alcune annotazioni:
1) Classico programma che usa la printf (ho provato anche una variante che
scriveva usando la putchar, usando un ciclo for attorno, ma non è cambiato
niente)
2) Il C++ ci sta pesando per circa 30kb :-)
3) Qui uso le funzioni del windows GetStdConsole per avere un handle alla
console e WriteConsole per scriverci sopra (sono funzioni dell'API di
Windows). Qui si vede quanti kb occupano le funzioni per scrivere su schermo
del C (14 kb circa) (probabilmente non avendo usato funzioni del C il linker
ha linkato pochissimo delle librerie standard del C, giusto il minimo
indispensabile per far partire il programma) (il programma è ancora un
programma console che usa il main) (questo giustificherebbe il perchè il
primo programma occupa più spazio del 5°: probabilmente il linker si deve
linkare un pezzettino di CRT per dare la possibilità di usare la console)
4) Il VC++ .NET inserisce di base due icone da più di 20kb l'una...
Chiaramente le ho eliminate!
5) Nessuna annotazione
Se qualcuno volesse i sorgenti che ho generato, sarò ben felice di
spedirglieli! :-)
(annotazione: un programma per Windows occuperà cmq di sicuro più di uno per
Linux, perchè ha all'inizio un piccolo STUB che scrive, se lanciato da
vecchio DOS, "This program cannot be run in DOS mode")
(altra annotazione: so che si possono fare cose turpi per ridurre il codice
di startup del C/C++, ma non l'ho fatto, perchè per un programma "umano"
serve tutto il codice di startup :-) )

 2) cout "Hello World\n": 68kb
attenzione a non confrontare capre con cavoli.  col setup di default,
gcc linka contro le librerie dinamiche, g++ linka staticamente.  che
parametri hai dato in fase di configure ?
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy              ROT13: 
ybe...@cq.vasa.vg

L'ho scritto: CRT linkato staticamente! Ed ho anche controllato con il
depends.exe. Nessuna dipendenza!
Da quello che ne so, linkare staticamente occupa più spazio. Lo sapevo che
se linkavo dinamicamente risparmiavo ancora di più.
--- bye

 parametri hai dato in fase di configure ?
In effetti forse hai frainteso. Io volevo dimostrare che la differenza era
piccola... In effetti il risultato migliore era il 4°... in appena 24 kb ci
stava una finestra con una dialog... e scusa se è poco :-)
--- bye

 "umano" serve tutto il codice di startup :-) )
Certo, puoi usare anche upx ma la il problema è come non avere 400K per
hello world. Quindi i casi sono due, o io (probabile, anzi quasi sicuro)
non so compilare i programmi, oppure gcc per windows fa schifo.
Propenderei per la prima, però vorrei che qualcuno almeno, dopo il mea
culpa, insegnasse anche a me.
Ciao.

 culpa, insegnasse anche a me.
Ho provato l'opzione -s del linker, le dimensioni sono dimezzate però
secondo me 200Kb, sono ancora tanti...

 viene con Windows?
E' roba che mette il compilatore, contenente tutto il codice di startup...
il VC++ ha circa 28 kb di dimensione fissa per lo startup code. Cmq dovrebbe
essere possibile settare il compilatore per fargli generare exe "piccoli".
La prova che non č colpa di windows č il fatto che in linguaggio assembler
si generano tranquillamente piccoli programmini perfettamente funzionanti
con un .exe di 4 kb :)
Ciao, Spider

 secondo me 200Kb, sono ancora tanti...
Se leggi le FAQ del mingw scoprirai che, per problemi di GPL/LGPL o cose
simili, linka sempre staticamente le librerie del C++. (la spiegazione č
che, mentre per quanto riguarda il C usa quelle della MS (msvcrt.dll), per
il C++ non le puň usare)
Invece sotto Linux di sicuro le userŕ dinamiche.
MSVC++ Runtime, librerie dinamiche, programma cout (quello che dicevi tu):
4096 bytes (sě, 4kb NETTI)
Depends: msvcp71.dll (499.712), msvcr71.dll (348.160 bytes)
--- bye

Cmq ho creato tutti gli esempi possibili per poter analizzare le varie
alternative... E poi non era chiaro dal messaggio che avevi scritto cosa tu
indendessi per scrivere Hello World sullo schermo. Stiamo parlando di
Windows... La console è un'appendice :-)
--- bye

 ha scritto nel messaggio
news:AEr4c.38178$z23.1...@news3.tin.it...

Grazie per le risposte... Purtroppo ammetto d'aver letto troppo
frettolosamente le FAQ, quel particolare mi era veramente sfuggito, o magari
l'ho letto anni fa e non lo ricordavo...
Almeno ho capito il motivo per le dimensioni "gonfiate" !
P.S. Io in questo gruppo di discussione intendo sempre standard C++, non si
deve far riferimento alle API specifiche di qualsiasi S.O.
ciao e grazie ancora.

 Ciao, Spider
In effetti abbiamo chiarito (con Massimiliano) come stanno le cose, mingw32
con C++ porta ad avere un codice di dimensioni maggiori rispetto a quello
che si ottiene con altri compilatori. Questo fenomeno, per la prima volta,
sono riuscito ad approfondirlo.