התחליף של sprintf עם std::string

eyalbd

New member
ברוב הספריות כן

למרות שבתיאוריה זה לא צריך להיות כך. יש מימושים של iostream שבהם משיגים אותם ביצועים כמו stdio אפשר למנות כמה סיבות: א. ספרית stdio ותיקה יותר ב. IO הוא ממילא צואר בקבוק. הוא האחרון שבו מבצעים אופטימיזציות. ג. בספריית ++C (לפחות ב IO) עדיין מיישרים קו עם ה-spec אופטימיזציות אח"כ ד. למי שביצועי IO מאד חשובים יורד עפ"ר נמוך יותר משתי הספריות. (ייתכן שאין הבדלים גדולים - לא מדדתי) ה. יש מימושים של iostream שמשתמשים בstdio למשל הספריה שבאה עם MSVC. כאן אי אפשר לצפות שiostream יהיה מהיר יותר. אני חושב שאחרי שיישרו קו עם הסטנדרד ועם שיפור במהדרי ++C הקביעה הזאת לא תהיה תמיד נכונה.
 

אלדד28

New member
אם נניח לרגע לפרקטיקה ונתרכז

בתיאוריה, הרי שסריקת מחרוזת בודדת ושיבוץ X פרמטרים תהיה יותר מהירה, תיאורטית, מאשר 2X+1 קריאות לפונקציות. אגב, יש דרך לשלוט בפורמט ברמה של printf? למשל, קביעת דיוק של float או קביעת משהו נוסח %08X? אני חושב שראיתי פעם חלק מהדברים האלו. מכיר?
 

eyalbd

New member
דווקא לא

במקום לסרוק פורמט בזמן ריצה ואח"כ לקרוא לפונקציה מפרמטת קואים לפונקציה ישירות. ואם זה inline ב-stdio אז זה יכול להיות גם בstdio לגבי השאלה השניה צריך להשתמש ב iomanip למשל
#include <iostream> #include <iomanip> using namespace std; int main() { // like "%08X" // cout << setw(8) << setbase(16) << setfill('0') << setiosflags(ios::uppercase) << 1000 << endl; }​
 

אלדד28

New member
וואלה, תודה על ה-set-ים.

ולא הבנתי את מה שכתבת בענייני ההשוואה בין >> לבין הקריאה היחידה של sprintf. נכון, היישומים של >> יכולים להיות inline ואז טענתי מתבטלת.
 

eyalbd

New member
אפשר לקצר זאת

ואופן דומה בפורמטים אחרים. זה בדיוק מה שקורא עם endl או IO-מניפולטורים אחרים. דוגמא:
#include <iostream> std::eek:stream& widehex(std::eek:stream& os) { os.width(8); os.fill('0'); os.setf(std::ios::uppercase); return os << std::hex; } int main() { using namespace std; // like "%08X" // cout << widehex << 1000 << endl; }​
 
למעלה