引用轉載請注明出處,謝謝!
使用引用類型進行返回值的傳遞經常可以看到,其優點非常明顯,如果引用的是對象,可以減少對象傳遞過程中的對象構造/析構等操作(EffectiveC++ 第三版,第20款),減少CPU資源消耗。但在使用應用的過程中,有些問題也需要注意,下面示例說明。
數據結構:
struct data_header
{
int type;
int length;
...........
};
方法a:
int parse_data(void *rec, char *buffer, int size_buffer, long long &saved_pos )
{
saved_pos = 0;
............
if( xxx )
{
saved_pos = pos;
}
...........
return 0;
}
方法b:
int parse_caller(void *rec, char *buffer, int size_buffer, long long &saved_pos )
{
......................
char *pcur = buffer;
char *pend = buffer + size_buffer;
do
{
int ret = 0;
data_header * head = (data_header*)pcur;
switch( head->type )
{
case 0:
break;
case 1:
ret = parse_data(rec, pcur, pcur-buffer, save_pos);
break;
..................
default:
break;
}
if( ret )
break;
...................
pcur += head->length;
...................
}while( pcur < pend );
return 0;
}
調用過程:
long long save_pos = 0;
int size_buffer = xxxxx;
char *buffer = new char[size_buffer];
...........
for( xxxxxxxx)
{
save_rec *rec = new save_rec;
.................
if( parse_caller(rec, buffer, size_buffer, save_pos) )
{
log("xxxxxxxxxxxx");
delete rec;
delete[] buffer;
return -1;
}
if(save_pos > 0 )
{
.........................
}
.............................
}
整個調用過程看似沒有任何問題,但在這個過程中,對於save_pos的賦值操作,結果卻是不定的,主要是由於在parse_caller的調用中,可能會多次調用parse_data方法,而parse_data的實現中可以看到,每次在進入方法後都會為save_pos做賦0操作,而只有在某些條件為真的情況下,才會進行有效的賦值。因此,多次的parse_data調用可能會導致前一次的有效值被覆蓋。
結論:
對於使用引用類型進行返回值傳遞的方法,對於引用變量,其初始值的設置最好是放在調用方法外面來完成。