ByVal vs ByRef

ByVal vs ByRef

רציתי להבין, איך זה שבספר של מיקרוסופט על VB6 כתוב שהעברת פרמטרים לפונקציה ByVal יותר מהירה? אני לתומי חשבתי שיותר מהר להעביר הפניה מאשר להעתיק את המשתנה ולהעביר את ההעתק לפונקציה? תודה מראש!
 
אולי הכוונה...../images/Emo26.gif

שבתוך הפונקציה, אם הפרמטר מועבר By address - אתה תצטרך לעשות dereference, מה שלא קורה אם אתה מעביר אותו by value?...
 
DEREFERENCE?

תודה על התגובה אבל א. אין לי מושג מה זה dereference, ב. מדובר שם בפירוש על אופטימיזציה למהירות ביצוע הקוד, שאם מעבירים ByVal הקוד יבוצע מהר יותר.
 

Pembelton

New member
dereference זאת הפעולה

שמבצע הקוד כאשר אתה קורא (או כותב) ערך של פרמטר שהועבר by-ref. בפרמטר כזה, בשביל לקבל את הערך שלו, התכנית נגשת מהפרמטר למשתנה המקורי וקוראת ממנו את הערך. לעומת זאת אם הפרמטר היה מועבר by-val אז הערך היה מאוחסן כבר בתוך הפרמטר ולכן אפשר לקרוא אותו ישירות. לסיכום: כאשר משתמשים בפרמטר by-ref אז העברת הפרמטר היא בד"כ יותר מהירה אבל הגישה לערך שלו איטית יותר.
 
תחשוב על זה ככה:../images/Emo26.gif

בוא נגיד שבכתובת 4000 יושב הערך 3 (int). אם תעביר לפונקציה את הפרמטר by value (כלומר 3), הפונקציה תוכל להשתמש בו ישר. אם תעביר לפונקציה את הפרמטר by address (כלומר 4000), הפונקציה תצטרך קודם "ללכת" לכתובת 4000, להוציא משם את הערך (3) ורק אז לבצע עליו את הפעולה. כלומר, באפשרות השניה (by address) יהיה שלב אחד נוסף של ללכת לזכרון ולבדוק מה הערך (למעשה - זה בדיוק derefernce...)
 
אהה...

תודה רבה לכולכם. אני רואה שלמעשה כולם מסבירים את אותו הדבר, רק במילים קצת שונות. אז תודה רבה, החכמתם אותי. אם כך, זה אומר שכשמעבירים מערך או אובייקט לפונקציה, שזה תמיד ByRef אם אני זוכר נכון, אם יש לי הרבה פעולות עליו בפונקציה שווה בתחילת הפונקציה ליצור "ידנית" העתק מקומי שלו ולעבוד עם ההעתק? או שבמערך זה באמת לא ישנה איכשהו? תודה רבה!
 
ממממ....../images/Emo4.gif../images/Emo26.gif

כשאתה פונה לאובייקט או למערך, הפעולות הנ"ל בכל מקרה יתבצעו (גם אם תעתיק אותם למשתנים לוקליים). כשאתה עושה: arr[2]; // example בכל מקרה מה שיקרה בפועל זה חישוב של arr+2 (כלומר, הכתובת של תחילת המערך + שני תאים קדימה) ורק אז הבאת הערך משם. ככה שהעתקת המערך לא תעזור לך. דבר שני - קח בחשבון שגם העתקה של הפרמטר בכל פעם שנקראת הפונקציה "עולה" לך... ודבר אחרון (והכי חשוב): KISS...
(שזה - Keep It Simple, Stupid). כלומר, גם אם הקוד לך יעשה איזה רבע-פעולה מיותרת שלא משפיעה בצורה משמעותית על הביצועים - אבל הקוד יהיה פי כמה יותר מובן ו"נקי" - אז פשוט אל תסתבך. המקרים בהם צריך להגן בחירוף-נפש על המילי-שניה המיותרת שהמעבד עובד - הם נדירים.
 

erezsh

New member
The size does matter

Passing vars by-ref, means pushing one register (which is a pointer). Passing vars by-val, mean either pushing one register if they are at the size of 32-bit or less (or 64-bit on newer machines), or copying whatever bytes they weigh otherwise. Therefor, passing references to structs/arrays is much faster than copying them (Almost always). Passing references to small variables (ints or less), is just about the same speed as passing themselves. But, when inside the function, reading variable directly is slightly faster than reading variables by reference. This can become meaningful if extensive use of the reference is done. So: Variables at the size of 32-bit (or 64-bit) or less, pass by-val, and others (struct, arrays, etc..) pass by-ref. Hope this helps.​
 
למעלה