Milline on C + + erinevus std:: cout ja fprintf vahel? Kas üks on parem või kiirem kui teine?


Vastus 1:

Std :: cout puhul kutsutakse argumendiks ülekoormatud operaator <<, samas kui fprintf puhul valatakse argument stringi. Mõlema taga olev põhiloogika jääb samaks.

cstdio on kiirem, kui sünkroonimine on lubatud, kuid iostream muutub kiiremaks ja mõnel juhul palju kiiremaks, kui keelate nende kahe vahelise sünkroonimise. Hea C ++ koodi korral tuleks kasutada ainult iostreami ja seega saate sünkroonimise keelata, helistades std :: ios :: sync_with_stdio (false).

MÄRGE

Vastupidiselt levinud arvamusele, kui sama funktsionaalsus on olemas nii C ++ kui ka C raamatukogudes, on C ++ rakendamine kompilaatorite optimeerimise tõttu peaaegu alati parem.


Vastus 2:

Jah, std :: cout on parem. See on std :: ostream ja sama on std :: stringstream, mis on sarnane printf variandiga, mida nimetatakse sprintf.

Printf-il on mitmeid probleeme.

  1. See kasutab vormingustringi, et täpsustada mitte ainult järelejäänud argumentide printimist, vaid ka nende tüüpide täpsustamist, mis ei hõlma tüübisüsteemi, seega ei tea kompilaator teie asja tüüpe trükkimine. Selle probleemi lahendamiseks proovivad uuemad C ja C ++ kompilaatorid tõlkida seda stringi kompileerimise ajal, mis on selle funktsiooni jaoks eriline kohtlemine. Ühtegi funktsiooni ei tohiks spetsiaalselt ravida. See kasutab varargsi, mis kustutab tüübi, seega on probleem nr 1 üsna vajalik, kui see ei peaks olema.

Std :: ostreamil, nagu std :: cout, on operaator << määratletud iga tüübi jaoks, mida soovite printida, ja enamik neist saab selle ülesande täitmiseks helistada oma primaarset tüüpi operaatorile <<. Iga operaatori << funktsioon teab tüüpi, mida ta prindib, ja on kompileerimise ajal täielikult ohutu, nii et käivitusprobleem, mis seisneb selles, et selle vormingus stringi alusel printfile pole piisavalt argumente, ei ole enam probleem, kuna std :: ostream ei ' t ei vaja vormingustringi.

Kiiruse erinevused sõltuvad täielikult rakendamisest, kuid std :: cout peab olema kaldkriipsuga kiirem kui printf.


Vastus 3:

Jah, std :: cout on parem. See on std :: ostream ja sama on std :: stringstream, mis on sarnane printf variandiga, mida nimetatakse sprintf.

Printf-il on mitmeid probleeme.

  1. See kasutab vormingustringi, et täpsustada mitte ainult järelejäänud argumentide printimist, vaid ka nende tüüpide täpsustamist, mis ei hõlma tüübisüsteemi, seega ei tea kompilaator teie asja tüüpe trükkimine. Selle probleemi lahendamiseks proovivad uuemad C ja C ++ kompilaatorid tõlkida seda stringi kompileerimise ajal, mis on selle funktsiooni jaoks eriline kohtlemine. Ühtegi funktsiooni ei tohiks spetsiaalselt ravida. See kasutab varargsi, mis kustutab tüübi, seega on probleem nr 1 üsna vajalik, kui see ei peaks olema.

Std :: ostreamil, nagu std :: cout, on operaator << määratletud iga tüübi jaoks, mida soovite printida, ja enamik neist saab selle ülesande täitmiseks helistada oma primaarset tüüpi operaatorile <<. Iga operaatori << funktsioon teab tüüpi, mida ta prindib, ja on kompileerimise ajal täielikult ohutu, nii et käivitusprobleem, mis seisneb selles, et selle vormingus stringi alusel printfile pole piisavalt argumente, ei ole enam probleem, kuna std :: ostream ei ' t ei vaja vormingustringi.

Kiiruse erinevused sõltuvad täielikult rakendamisest, kuid std :: cout peab olema kaldkriipsuga kiirem kui printf.


Vastus 4:

Jah, std :: cout on parem. See on std :: ostream ja sama on std :: stringstream, mis on sarnane printf variandiga, mida nimetatakse sprintf.

Printf-il on mitmeid probleeme.

  1. See kasutab vormingustringi, et täpsustada mitte ainult järelejäänud argumentide printimist, vaid ka nende tüüpide täpsustamist, mis ei hõlma tüübisüsteemi, seega ei tea kompilaator teie asja tüüpe trükkimine. Selle probleemi lahendamiseks proovivad uuemad C ja C ++ kompilaatorid tõlkida seda stringi kompileerimise ajal, mis on selle funktsiooni jaoks eriline kohtlemine. Ühtegi funktsiooni ei tohiks spetsiaalselt ravida. See kasutab varargsi, mis kustutab tüübi, seega on probleem nr 1 üsna vajalik, kui see ei peaks olema.

Std :: ostreamil, nagu std :: cout, on operaator << määratletud iga tüübi jaoks, mida soovite printida, ja enamik neist saab selle ülesande täitmiseks helistada oma primaarset tüüpi operaatorile <<. Iga operaatori << funktsioon teab tüüpi, mida ta prindib, ja on kompileerimise ajal täielikult ohutu, nii et käivitusprobleem, mis seisneb selles, et selle vormingus stringi alusel printfile pole piisavalt argumente, ei ole enam probleem, kuna std :: ostream ei ' t ei vaja vormingustringi.

Kiiruse erinevused sõltuvad täielikult rakendamisest, kuid std :: cout peab olema kaldkriipsuga kiirem kui printf.


Vastus 5:

Jah, std :: cout on parem. See on std :: ostream ja sama on std :: stringstream, mis on sarnane printf variandiga, mida nimetatakse sprintf.

Printf-il on mitmeid probleeme.

  1. See kasutab vormingustringi, et täpsustada mitte ainult järelejäänud argumentide printimist, vaid ka nende tüüpide täpsustamist, mis ei hõlma tüübisüsteemi, seega ei tea kompilaator teie asja tüüpe trükkimine. Selle probleemi lahendamiseks proovivad uuemad C ja C ++ kompilaatorid tõlkida seda stringi kompileerimise ajal, mis on selle funktsiooni jaoks eriline kohtlemine. Ühtegi funktsiooni ei tohiks spetsiaalselt ravida. See kasutab varargsi, mis kustutab tüübi, seega on probleem nr 1 üsna vajalik, kui see ei peaks olema.

Std :: ostreamil, nagu std :: cout, on operaator << määratletud iga tüübi jaoks, mida soovite printida, ja enamik neist saab selle ülesande täitmiseks helistada oma primaarset tüüpi operaatorile <<. Iga operaatori << funktsioon teab tüüpi, mida ta prindib, ja on kompileerimise ajal täielikult ohutu, nii et käivitusprobleem, mis seisneb selles, et selle vormingus stringi alusel printfile pole piisavalt argumente, ei ole enam probleem, kuna std :: ostream ei ' t ei vaja vormingustringi.

Kiiruse erinevused sõltuvad täielikult rakendamisest, kuid std :: cout peab olema kaldkriipsuga kiirem kui printf.