Newsgroup: it.comp.lang.c++
Titolo: non so se e' giusto postare qua

volevo solo chiedere una delucidazione ... non sapendo se puo' centrare con
il c++ standard ...
mi capita che appena includo qualsiasi cosa della stl in un programma questo
genera un eseguibile enorme ... il compilatore e' il gcc(mingw) sapete
spiegarmi come mai ???
lo stesso programma usando stdio.h genera un eseguibile di 12k non
ottimizzato invece usando iostream l'eseguibile vola a 400-500k !!! cioe' mi
pare uno strano comportamento per un semplice hello world in terminale no
???
ciao

 ciao
ciao
Sinetris

 di più non so', mi dispiace.
la faccia dell'ottimizzazione ... in 400k con le librerie c normali ci fai
un winamp che e' un sw con i controcazzi ... altro che una caccola di hello
world di prova di compilazione ...
speriamo che qualcuno mi indichi il perche' di queste enormita' ... che cmq
anche il borland stando sui 100k dimostra che c'e' qualcosa che non funzica
...
ciao

 un winamp che e' un sw con i controcazzi ... altro che una caccola di
hello
Che è fatto con le API intanto!!
Hello world fatto con le API di windows stava se non ricordo male in 4K.

 ha scritto nel messaggio
news:bg1b5k$2jk$1...@lacerta.tiscalinet.it...

io l'ho fatto in terminal dos ... quindi ... quando hai dei suggerimenti per
aiutarmi a capire il perche' di sto sovradimensionamento dell'exe sei ben
accetto ...
questa risposta non mi pare granche utile nel tread o no ???
ciao

 spiegarmi come mai ???
Per come sono definiti gli elementi della libreria standard sono molto
interdipendenti tra loro, quindi quando ne includi uno e' facile che
te ne tiri dietro molti altri. In piu' trattandosi in molti casi di
template il codice e' spesso incluso direttamente nell'eseguibile.
Ciao,
Nicola

 template il codice e' spesso incluso direttamente nell'eseguibile.
quindi nessun modo per snellire tutto il codice che non mi serve dentro
l'eseguibile ???
ciao

 ciao
idem!

 inclusioni) è a prescindere dall'uso della GUI o meno!
#include <iostream>
using namespace std;
int main (int argc, char *argv[])
{
  cout << "Hello World!" << endl;
  cout << "Press ENTER to continue..." << endl;
  system("PAUSE");
  return 0;
}
questo e' il semplice programmino ... cambiando l'inclusione da iostream a
stdio.h e ovviamente da cout a printf l'eseguibile generato ha 400k in piu'
o in meno ...
quindi non ho linkato api o altre librerie, mi chiedevo solo perche' usando
i template venisse generato un file da 400k quando senza di essi si rimane a
10k, e' questo il fatto strano che non riesco a chiarirmi ... e pare che
nessuno sappia rispondermi su questo fatto, e su come porvi rimedio ...
cioe' non vorrei continuare a distribuire eseguibili da 400k quando e'
possibile farli diventare da 10k ...
spero che ora mi sia chiarito meglio ...
ciao

 possibile farli diventare da 10k ...
Non è possibile, avere a disposizione tutta la potenza delle classi C++ in
10k, o usi gli header del C oppure chiami direttamente le API del S.O. non
mi sembra così difficile da capire! No!?
Una via di mezo è quella di utilizzare programmi come UPX per comprimere il
codice.

 codice.
ok ma perche' gia' il linker non taglia di suo le classi ed i metodi non
usati ??? se lo facesse il file per tanto grosso che diventa diventa 20k ...
ciao e grazie delle risposte

...

su linux con g++ 
#include <iostream>
using namespace std;
int main(void)  {
           cout << "Hello world!";
}
occupa 5.2kb, quando usavo windows mi ero anch'io accorto degli
eseguibili molto grossi, credo che sia come ti hanno risposto a causa
delle Api.

 delle Api.
si ma su linux hai virtualmente sempre linkate le libc(glibc) quindi i tuoi
programmi si linkano sempre dinamicamente a tale libreria ...
l'assurdita' invece in win e' avere magari una libreria statica di funzioni
c che ti si linka staticamente in toto ... caricandoti quei 300-400k ... :-/
mi pare un po assurdo ... e non conoscendo neanche bene il gcc non so se
c'e' un modo per digli di non linkarla o di linkare solo le funzioni usate
... (cio' che pare succedere se si usano le funzioni c invece delle lib c++)
e' questa impressione che mi rimane che il gcc non riesca a vedere le
funzioni inutili quando si usano le librerie c++ ...
questo IMHO ... pero' pare che nel forum non ci siano neanche esperti di gcc
che mi rispondano ... o che conoscano il problema e sappiano come risolverlo
...
l'unica cosa che posso fare per ora e' aspettare le nuove uscite di mingw e
del gcc per vedere se questi particolari migliorano ...
ciao

 ciao e grazie delle risposte
Non ci sono risposte, evidentemente non č cosě semplice... E' molto piů
semplice per il programmatore usare printf se non ti serve tutta la potenza
di cout e t'interessa stare in poco spazio... non te lo vieta nessuno!
Probabilmente il costo per fare quello che chiedi non porta un grande
beneficio (almeno dalla maggior parte degli sviluppatori), non a caso il C
proprio in virtů della sua efficienza č ancora molto usato, ad esempio, in
soluzioni embedded e per gli S.O., ma su un PC con mezzo giga di RAM come ci
sono adesso avere un eseguibile da 10k o da 400k non fa alcuna differenza, č
solo un puntiglio!

 che mi rispondano ... o che conoscano il problema e sappiano come risolverlo
Forse semplicemente non vogliono andare OT.
Ciao,
Nicola

 Forse semplicemente non vogliono andare OT.
e scusa dove dovrei andare ??? si parla di compilazione in standard con
confronto con piu' compilatori e piu' piattaforme, rientra perfettamente nel
manifesto del gruppo questa discussione.
ciao

 che mi rispondano ... o che conoscano il problema e sappiano come risolverlo
Se vuoi avere informazioni specifiche su gcc cercati un newsgroup
specifico.
Ciao,
Nicola

 specifico.
la frase a me' non pare offensiva ... come mai dovrebbe essere offensiva ???
per il resto non ho capito che mi stavi consigliando di cambiare grupp solo
per la parte in cui chiedevo come mai il gcc si comportava cosi' ... cmq in
it sai dove sarebbe piu' possibile trovare risposte ???
cmq avrei voluto vedere anche cosa generava un vc ... perche' non so se
anche lui gonfia gli exe con le classi template c++ ... visto che all'inizio
del tread mi ha risposto una persona che ha fatto la prova anche con il
borland ed anche li si notava un'occupazione spropositata dell'exe, meno che
con il mingw cmq ... e mi ha pure detto che sotto linux con gcc l'eseguibile
rimaneva sotto i 10k (cio' spiegato dal fatto che linux ha le dyn_lib (libc
e glibc)).
ora se qualche d'uno che ha vc o il compilatore intel vule fare delle prove
con hello world su cout e postare i risultati ne sarei felice soprattutto
perche' si capirebbe quale e' il compilatore che riesce a togliere la
maggior parte del codice inutile senza usare tool esterni come UPX che mi
hanno consigliato ...
ciao

 e glibc)).
Le prove col BCB6 le ho fatte io, compilando il seguente:
#include <iostream>
int main(int, char* [])
{
    std::cout << "Hello, World!\n";
    return 0;
}
Questo a seconda dele opzioni varia tra i 10k e i 13k. Quest'altro
programmino:
#include <vector>
int main(int, char* [])
{
    std::vector<int> v;
    v.push_back(1);
    v.push_back(2);
    return v.size();
}
risulta in 11k.
Entrambe mi paiono risultati accettabili.
Tra parentesi non dimenticare che gli eseguibili compilati con gcc
contengono la symbol table che puo' essere eliminata col comando
strip. Questo puo' ridurre notevolmente la dimensione dell'eseguibile.
Ciao,
Nicola