14-03-2010, 17:47
|
|
|
|
חבר מתאריך: 14.12.09
הודעות: 9,751
|
|
ציטוט:
במקור נכתב על ידי Dark Knight
אני לא חושב שלהתעלם מהאפשרות לאופטימיזציה זו טעות "ענקית"...
|
זו טעות די גדולה, בהתחשב במדובר באופטימיזציה שמאוזכרת בתקן של השפה, ועבורה יש חריג מהכלל שקבוע עבור אופטימיזציות בתקן (שאסור להן לשנות את "ההתנהגות הנצפית" של השפה).
ציטוט:
במקור נכתב על ידי Dark Knight
לצורך העניין כשאתה במצב debug אתה לא תחזה באופטימיזציות...
|
לצורך העניין, כשאתה במצב debug לא אכפת לך מביצועים, ולכן לא אכפת לך מאופטימיזציות...
ציטוט:
במקור נכתב על ידי Dark Knight
חוץ מזה, מה שאמרתי נכון מבחינת המבנה הלוגי של השפה, ולא מבחינה של קוד הריצה הסופי שעובר אופטימיזציות שלך, כמתכנת, אין הרבה שליטה עליהן מעבר לפרמטרים מסויימים שאתה יכול להעביר למהדר...
|
שפת C++ היא שפה שמטרתה להיות קרובה במידה מסוימת ל"קוד הריצה הסופי", וכמתכנת יש לך ברירה בבחירת הקומפיילר המועדף עליך ובשילוב קוד אסמבלי במקרה שביצועי הקומפיילר במקרה ספציפי אינם מספקים.
ציטוט:
במקור נכתב על ידי Dark Knight
גם אם ניקח בחשבון את האופטימיזציה האפשרית הזו, זה לא משנה את העובדה שלפחות עותק זמני אחד יווצר, זה שבתוך הפונקציה עצמה...
|
והעותק ה"זמני" הזה הוא שיוחזר מהפונקציה. ללא העתקה. הטענה שלך מראה שלא קראת (או שיש לך קשיים רציניים בהבנה).
ציטוט:
במקור נכתב על ידי Dark Knight
אני לא חושב שהאופטימיזציה האחרונה, זו שחוסכת את העותק הפנימי בכלל אפשרית במקרה הספציפי פה כשיש למשל שרשרת של הפעלות אופרטור,
|
היא תחסוך את ה-copy constructor-ים. מובן שאין לה השפעה על עצם זה שתוצאת האופרטור a+b מחזירה אובייקט חדש ולא משנה את a או את b. אבל האובייקט החדש לא יועתק, אלא יווצר היכן שצריך על ההתחלה.
ציטוט:
במקור נכתב על ידי Dark Knight
וגם אם כן, האתגר פה מתעלם מהאופטימיזציות - בעיקר כשמדובר במשהו שהוא תלוי מהדר לפי מה שנכתב בעמוד שצרפת...
|
כשאתה מדבר על ביצועים של קוד ולא של אלגוריתם, אתה מדבר על אופטימיזציות-קוד. זה שיש סוגים שונים של אופטימיזציות זה עניין אחר. כל המהדרים ה"מסחריים" תומכים באופטימיזציה הזו (כולל GCC)
ציטוט:
במקור נכתב על ידי Dark Knight
האמת, חשבתי בשלב כלשהו לכתוב שהאמור להעיל מתעלם מאופטימיזציות וויתרתי על המשפט הזה בסופו של דבר.. אולי חבל..
|
חבל.
ציטוט:
במקור נכתב על ידי Dark Knight
הפתרון שאני חשבתי עליו שונה מהגישה שהוצגה בכתבה שצרפת ומשתמש בעקרונות של OOP בצורה די אלגנטית, במקום לשלוח את האובייקט עצמו..
|
יפה לך.
ציטוט:
במקור נכתב על ידי Dark Knight
חוץ מזה, האם האופטימיזציה הייתה אפשרית במקרה של
(Matrix C(A+B?
לא בלי לשנות את הסמנטיקה...
|
זה בדיוק המצב בו האופטימיזציה פועלת. כדאי שתקרא קצת לפני שאתה מגיב. הפלט של הקוד הבא על VCPP EXPRESS 2008 במצב דיבאג:
קוד:
#include <iostream>
class C {
public:
explicit C(int i) : m_i(i) { print("C::C(int)"); }
C(const C& other) : m_i(other.m_i) { print("C::C(const C&)"); }
C operator+(const C& right) { print("C::operator+(const C&)"); return C(m_i+right.m_i); }
int get() { return m_i; }
protected:
int m_i;
void print (const char * const text) { std::cout << text << std::endl; }
};
int main() {
C a(1);
C b(2);
C c(a+b);
C d(C(3)+C(4));
C e(C(C(5)+C(6))+C(C(7)+C(8)+C(9)));
std::cout << c.get() << std::endl;
std::cout << d.get() << std::endl;
std::cout << e.get() << " == " << (5+6+7+8+9) << std::endl;
return 0;
}
הוא:
קוד:
C::C(int)
C::C(int)
C::operator+(const C&)
C::C(int)
C::C(int)
C::C(int)
C::operator+(const C&)
C::C(int)
C::C(int)
C::C(int)
C::C(int)
C::operator+(const C&)
C::C(int)
C::operator+(const C&)
C::C(int)
C::C(int)
C::C(int)
C::operator+(const C&)
C::C(int)
C::operator+(const C&)
C::C(int)
3
7
35 == 35
או בקיצור - כן, זה בדיוק המצב עליו מדובר. למה אתה לא קורא?
וכמו ששמת לב - האופטימייזר כיסה את כל המקרים, גם במקרה המורכב, לא נקרא אפילו CC אחד!
|