Newsgroup: it.comp.lang.c++
Titolo: [newbie] Compilazione efficiente

Salve a tutti,
Sono di ritorno dopo che qualche settimana fa vi chiesi consigli per 
attrezzare dal nulla un ambiente di sviluppo (vi ringrazio per le dritte!).
Ora sto muovendo qualche passettino col compilatore GNU fatto girare in 
Cygwin.
C'è tuttavia un problema: mi sono accorto, compilando il ridicolo modulo 
'hello world' seguente, che l'eseguibile risultante è grande la 
spropositata cifra di 500 KBytes!
// BEGIN code
#include <iostream>
using namespace std;
int main()
{
     cout << "Hello, World!\n";
     return 0;
}
// END code
Qualcuno sa dirmi cosa sto sbagliando? Si vedono in giro eseguibili da 
pochi KBytes i cui autori dichiarano essere stati scritti in c++... 
invece io mi ritrovo con un mostricciattolo obeso!
Ci sono delle linee guida per compilare in modo efficiente il codice c++?
Grazie

 risultante è grande la spropositata cifra di 500 KBytes!
La dimensione non ha nulla a che fare con l'efficienza, detto questo
500Kb per un PC non e' nemmeno tanto. Quale e' il tuo problema? Se tu
potessi compilare tale programma in 1Kb cosa ti cambierebbe?
Inoltre, solitamente, Hello World non e' molto piu' piccolo di un
programma molto piu' complesso.  In altre parole non e' che se stampi 8
frasi come hello world invece che una il programma diventa 4Mb!!! Quindi
non ti preoccupare, vedrai che il programma crescera' di pochi Kb ogni
molte righe di codice.
In linux potresti usare il comando strip, etc..., in VC++ potreti
comunicare che preferisci codice piccolo piuttost che veloce (cosa che
solitamente non ha senso).
Con Cygwin francamente non so.
A mio avviso il vero problema sta nel comprendere che, salvo casi
eccezionali (ad esempio su alcuni sistemi embedded) la dimensione non e'
quasi mai il problema.
Alcuni Hello World occupano meno Kb, certo. Visual C++ 2005 Express
Edition Beta 2 crea un eseguibile di 6Kb, ma non e' che per questo mi
senta meglio. (se compilo in modalita' debug sono 44Kb).
Cygwin e' prodotto molto particolare, emula l'ambiente linux. Non e' un
compilatore, e' un ambiente simulato su cui gira un compilatore (piu' o
meno, non voglio essere un esperto di cygwin che conosco appena).
Per concludere ricorda che le librerie del C++ tendono a gonfiare
l'eseguibile, se include cstdio invece di iostream e scrivi puts("Hello
World"); c'e' caso che occupi meno Kb. Nel mio caso passo da 6k a 4k.
Questo non e' un buon motivo per usare cstdio, iostream e' molto
migliore in programmi C++.
Qualcuno che conosce cygwin magari ti dira' come ridurre le dimensioni,
ma sicuramente non stai usando l'environment piu' "normale" e non puoi
aspettarti molto (se non buona aderenza allo standard visto che usa gcc
e ... emulazione ambiene linux che magari ti puo' far comodo).
Tommaso
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Ci sono delle linee guida per compilare in modo efficiente il codice c++?
In Win32 per esempio puoi creare l'HelloWorld in veramente pochi kbyte,
codice C++ bello pulito, un bel CreateWindow, e la cosa e' fatta!
Se vuoi una dimensione ancora minore l'unica soluzione e' di scrivere
direttamente in assembly! oppure puoi integrare codice asm in C++, ma a
questo punto di conviene farlo tutto in asm...
Hai mai provato (Win OS) a vedere quante dll e funzioni carica un
eseguibile che non fa niente?? rimarresti alquanto stupito!


 veloce (cosa che solitamente non ha senso).
Per fare il più piccolo, bisogna linkare dinamicalemente. Sul
Solaris (con g++), è il default -- 'hello world' fa 9 KB. Se
precisa -static, per linkare static, fa più di 4 MB. Non sò che
sono i defaults soto CygWin, ma cercarò in questa direzzione.
--
James Kanze                                           GABI Software
Conseils en informatique orientée objet/
                   Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, 
+33 (0)1 30 23 00 34

 questo punto di conviene farlo tutto in asm...
Non fare lo spiritoso! ;-)

Blue Gecko wrote:

infatti, uno fa il figo scrivendo tutto in asm, poi linka da 
dentro l'IDE in modo statico fior di librerie e ottiene un 
eseguibile grande uguale a prima, eh he he.
Voglio dire che, se l'asm serve a ottimizzare qualche loop 
fortemente annidato per spremere velocità, passi pure.
Ma compattare il codice c++ nudo e crudo per ridurre lo spazio è 
una fatica ingrata e con poco margine, dato che il grosso di 
spazio sprecato (quando pure è sprecato) è dato da codice 
esterno (lib varie) che nel programma manco si vede scritto.
Meglio studiarsi le opzioni che il compilatore passa al linker.
ciao
Soviet-Mario

 Non fare lo spiritoso! ;-)
Nient'affatto! sono serissimo!


 eseguibile grande uguale a prima, eh he he.
Esatto, come dici te, dipende dal compilatore.
Ma io intendevo piuttosto scrivere TUTTO in ASM e poi compilare con, ad
esempio, masm, senza andare a scomodare un compilatore ad "alto
livello". E poi in ASM si possono fare ottimizzazioni piu' spinte...


 eseguibile grande uguale a prima, eh he he.
Esatto, come dici te, dipende dal compilatore.
Ma io intendevo piuttosto scrivere TUTTO in ASM e poi compilare con, ad
esempio, masm, senza andare a scomodare un compilatore ad "alto
livello". E poi in ASM si possono fare ottimizzazioni piu' spinte...


 Nient'affatto! sono serissimo!
OK, ma a me sembra che stiamo girando attorno al discorso: stiamo 
scrivendo su un ng di linguaggio c++, che accipicchia tiri fuori 
assembly? inoltre il mio quesito verteva esclusivamente sulla buona 
compilazione da codice c++...

 codice .... per lo meno per l'uomo medio (se uno pensa 
Difatti e' un linguaggio a basso livello. Non quello a piu' basso
livello, comunque... :)


 codice .... per lo meno per l'uomo medio (se uno pensa 
Difatti e' un linguaggio a basso livello. Non quello a piu' basso
livello, comunque... :) WYSIWYG...


 compilazione da codice c++...
Non l'ho mai messo in dubbio.


 codice .... per lo meno per l'uomo medio (se uno pensa 
Difatti e' un linguaggio a basso livello. Non quello a piu' basso
livello, comunque... :) WYSIWYG...


 linguaggio.
Ricapitolando: il mio eseguibile "stub" occupava 500KB e volevo 
semplicemente sapere come poter rendere accettabile la sua dimensione 
entro pochi KB, senza troppi segotti mentali. James Kanze, nel primo 
branch di questo thread, ha suggerito il linking dinamico delle librerie 
esterne: non è questa la soluzione più lineare ed economica?
[snip]

 esterne: non è questa la soluzione più lineare ed economica?
Solo se tali librerie sono incluse nel sistema operativo. Altrimenti devi
comunque portartele appresso, anche se separate dall'eseguibile.
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg
The EMG Music page:         
http://www.emagsoftware.it/emgmusic

 comunque portartele appresso, anche se separate dall'eseguibile.
In effetti, questo aspetto è immediatamente correlato al precedente: 
secondo la tua esperienza, su OS come Windows 2000+ o *nix la libreria 
standard c++ è sempre disponibile?
Per quanto riguarda il linking, immagino che quello dinamico sia 
l'opzione generalmente preferenziale: in quali occasioni può essere 
utile opzionare il linking statico?

 utile opzionare il linking statico?
Credo che il linking statico sia quello più utilizzato, almeno per le
librerie standard. Per le altre il discorso cambia ma è legato più al
sistema operativo che al C++.
Ora però basta perché siamo OT.


 Ci diventi matto.
Ce n'è, di pazzi del genere:
http://www.menuetos.org
Scusate l'OT, ma è davvero pazzesco. :D
-- 
[ Andrea Spadaccini - a.k.a. Lupino/Lupin85 - Catania - ICQ#: 91528290 ]
[ GPG ID: 5D41ABF0 - key @ 
pgp.mit.edu
 - Slackware 10.1 w/Linux 2.4.22 ]
[ Linux User # 313388 - MAIL: a.spadaccini(at)catania(dot)linux(dot)it ]
[ Instead of studying, I'm listening to:  Radiohead - Paranoid android ]