printf() "schneller" als cout<<?
-
0xdeadbeef schrieb:
Der gcc akzeptiert es deswegen auch ab Version 3.4 nicht mehr.
Eigentlich geht das sogar schon länger nicht mehr, ich kann Dir jetzt keine genauen Versionsnummern nennen, aber ich habe noch immer einen 3.3er g++ und der mag das schon nicht mehr.
-
0xdeadbeef schrieb:
C89 ist da recht liberal, C99 dagegen erlaubt nur
int main(void); // _nicht_ int main(), das ist entgegen der landläufigen Meinung ein Unterschied int main(int argc, char *argv[]);
...das heißt, wenn ich mich grad nicht sehr irre.
In C++ ist ein void func(void) gleichbedeutend mit void func()!
-
In C++ schon, in C aber nicht.
-
MaSTaH schrieb:
net schrieb:
btw: printf ist eh' besser als cout. es kann besser die ausgaben formatieren
Ach? Was kann ich denn mit printf machen was ich mit cout nicht machen kann?
printf ist etwas schneller. und...
// ausgabe: 00001.23 3.4000000 5.600000e+000 FFFFFFFF printf("%08.2f %.7f %e %p\n", 1.2345, 3.4, 5.6, -1);
mach das mal mit cout
geht vielleicht, sieht aber schlimm aus mit den ganzen setiosflags() da drin
-
-
net schrieb:
MaSTaH schrieb:
net schrieb:
btw: printf ist eh' besser als cout. es kann besser die ausgaben formatieren
Ach? Was kann ich denn mit printf machen was ich mit cout nicht machen kann?
printf ist etwas schneller. und...
Unwichtig! Wenn ich Zeit habe eine Konsolenausgabe zu machen, dann darf es mir um die ms auch nicht ankommen. Ausserdem glaube ich, dass der Performancegewinn nur theoretisch ist.
net schrieb:
// ausgabe: 00001.23 3.4000000 5.600000e+000 FFFFFFFF printf("%08.2f %.7f %e %p\n", 1.2345, 3.4, 5.6, -1);
mach das mal mit cout
geht vielleicht, sieht aber schlimm aus mit den ganzen setiosflags() da drinSo etwas sieht mit cout in der Tat gruselig aus. Nun muss man sich aber fragen, wie oft man so etwas braucht und, ob einem typensicherheit nicht wichtiger ist.
Gruß,
Christian
-
net schrieb:
// ausgabe: 00001.23 3.4000000 5.600000e+000 FFFFFFFF printf("%08.2f %.7f %e %p\n", 1.2345, 3.4, 5.6, -1);
mach das mal mit cout
#include <iomanip> #include <iostream> int main() { std::cout << std::setw(8) << std::setfill('0') << std::setprecision(2) << std::fixed << 1.2345 << ' ' << std::setprecision(7) << std::fixed << 3.4 << ' ' << std::scientific << 5.6 << ' ' << std::hex << std::showbase << -1 << std::endl; }
-
MaSTaH schrieb:
Unwichtig! Wenn ich Zeit habe eine Konsolenausgabe zu machen, dann darf es mir um die ms auch nicht ankommen. Ausserdem glaube ich, dass der Performancegewinn nur theoretisch ist.
er ist messbar, also real. theoretisch ist cout schneller, aber praktisch ist printf schneller.
aber nicht viel in beiden richtungen.
wenn man selber scrollt, statt das bs scrollen zu lassen, ist man wesentlich schneller als printf und cout. falls jemand speed will, soll er also bestimmt nicht aufs lustige printf umsteigen, wenn er mit nem cout-replacement wahnsinnige speed riegen würde.
-
net schrieb:
// ausgabe: 00001.23 3.4000000 5.600000e+000 FFFFFFFF printf("%08.2f %.7f %e %p\n", 1.2345, 3.4, 5.6, -1);
mach das mal mit cout
geht vielleicht, sieht aber schlimm aus mit den ganzen setiosflags() da drin// ausgabe: coredump/schutzverletzung printf("%08.2f %.7f %s %p\n", 1.2345, 3.4, 5.6, -1);
mach das mal mit cout
geht vielleicht, aber man müßte schon gehirnoperiert sein, cout<<static_cast<char*>(0); zu schreiben.
-
Jojo, die ultrakrasse 3D-Grafik in einer Konsole muss schon performant sein.
0xdeadbeef schrieb:
net schrieb:
// ausgabe: 00001.23 3.4000000 5.600000e+000 FFFFFFFF printf("%08.2f %.7f %e %p\n", 1.2345, 3.4, 5.6, -1);
mach das mal mit cout
#include <iomanip> #include <iostream> int main() { std::cout << std::setw(8) << std::setfill('0') << std::setprecision(2) << std::fixed << 1.2345 << ' ' << std::setprecision(7) << std::fixed << 3.4 << ' ' << std::scientific << 5.6 << ' ' << std::hex << std::showbase << -1 << std::endl; }
Da gefällt mir die cout-Lösung wesentlich besser. printf ist C ohne ++. Fertig. :p
-
volkard schrieb:
// ausgabe: coredump/schutzverletzung printf("%08.2f %.7f %s %p\n", 1.2345, 3.4, 5.6, -1);
printf.c:4: warning: format argument is not a pointer (arg 4)
printf.c:4: warning: format argument is not a pointer (arg 5)
-
Bashar schrieb:
printf.c:4: warning: format argument is not a pointer (arg 4)
printf.c:4: warning: format argument is not a pointer (arg 5)gcc zu nehmen ist gemein.
-
Also ich finde die Ausgeben von großen Strukturen bzw.Klassen sehen mit cout eleganter aus...
//Funktion beinhaltet Referenz auf ein objekt von ostream... ostream & operator << (ostream &o,Kugel &k) { o << "\n Durchmesser :"<< k.kugel; ... } //Hauptfunktion cout <<"_______Kugel-Daten______" cout << kugel;
-
volkard schrieb:
Bashar schrieb:
printf.c:4: warning: format argument is not a pointer (arg 4)
printf.c:4: warning: format argument is not a pointer (arg 5)gcc zu nehmen ist gemein.
Wenn dieses Feature so toll wäre, hätten es sicher schon andere Compiler übernommen. So schwer kann das ja nicht zu implementieren sein. Die Wahrheit ist, dass solche Warnungen kein Mensch braucht, weil dieses "Problem" im echten Leben überhaupt nicht auftritt.
-
Bashar schrieb:
volkard schrieb:
Bashar schrieb:
printf.c:4: warning: format argument is not a pointer (arg 4)
printf.c:4: warning: format argument is not a pointer (arg 5)gcc zu nehmen ist gemein.
[...] Die Wahrheit ist, dass solche Warnungen kein Mensch braucht, weil dieses "Problem" im echten Leben überhaupt nicht auftritt.
wie kommst du denn darauf? Ich freue mich, wenn ich die Problematik schon beim Kompilieren sehe und nicht erst während der Ausführung.
Und solche printf("Hallo %s")-Fehler, sind bei mir an der Tagesordnung
-
0xdeadbeef schrieb:
std::cout << std::setw(8) << std::setfill('0') << std::setprecision(2) << std::fixed << 1.2345 << ' ' << std::setprecision(7) << std::fixed << 3.4 << ' ' << std::scientific << 5.6 << ' ' << std::hex << std::showbase << -1 << std::endl; }
ganz schön lang.
wenn mich einer fragen würde, wie man mit cout '00001.23 3.4000000 5.600000e+000 FFFFFFFF' mit diesen werten ausgibt, würde ich vielleicht sowas vorschlagen:char buff[256]; sprintf (buff, "%08.2f %.7f %e %p", 1.2345, 3.4, 5.6, -1); std::cout << buff << std::endl;
-
...und bei der nächsten Gelegenheit vertippt er sich und wundert sich, dass der Compiler ihn nicht drauf hinweist, dass %d mit nem float völliger Bockmist ist.
-
Bashar schrieb:
Die Wahrheit ist, dass solche Warnungen kein Mensch braucht, weil dieses "Problem" im echten Leben überhaupt nicht auftritt.
stimmt. man braucht gar kein printf, weil man keine formatierte ausgabe in c++ macht. einfach tab-separierte ausgabe und wer die daten hübsch haben mag, lädt sie in excel rein. drei klicks weiter kann er sogar ein tortendiagramm (schauder) haben.
und die ganzen male, daß ich sprintf verwendet habe, kann ich mich auch nicht an nen typfehler erinnern.
-
Vielleicht vertippst du dich ja wirklich nie, aber ich für meinen Teil hab mich, gerade wo d auf meiner Tastatur zwischen s und f liegt, schon öfter mit printf und falschen format-strings rumärgern müssen. Zugegeben, der Fehler ist recht einfach zu debuggen, aber nervig ist es trotzdem.
Im Endeffekt ist es wohl Geschmackssache. Für meinen Geschmack ist das C++-API jedenfalls schöner, weil typsicherer - will sagen, es nimmt mir Arbeit ab. An dieser speziellen Stelle schreib ich damit nicht den performantesten Code aller Zeiten, aber dafür sinkt meine Entwicklungszeit - und das ist im echten Leben ne ganze Menge wert.
-
0xdeadbeef schrieb:
Vielleicht vertippst du dich ja wirklich nie
ich bin grossmeister im vertippem. möglicherweise ist das auch einer der gründe, warum ich c++ so mag.