2011-01-17 32 views
0

我使用流媒體運算符(例如operator<<(const char*))進行記錄。在我的單元測試中,我有如下測試:什麼時候計算參數,當連接調用時:obj.F1()。F2()。F3(sin(x))?

MyLogger oLogger; 
oLogger << "charly"; 
oLogger << "foo" << sleep(10) << "bar"; 
oLogger << "marcus"; 

首先我執行了第二個線程,它應該同時登錄。我想知道,爲什麼"foo""bar"之間沒有生成其他的日誌輸出。所以我在當前時間在每個操作員身上打印。我希望這樣的事情:

50 sec 137051 usec charly 
50 sec 137930 usec foo 
60 sec 138014 usec 0 
60 sec 138047 usec bar 
60 sec 138088 usec marcus 

但得到這樣的:

50 sec 137051 usec charly 
60 sec 137930 usec foo 
60 sec 138014 usec 0 
60 sec 138047 usec bar 
60 sec 138088 usec marcus 

有什麼不對的以下想法:

[ 0 sec] MyLogger& MyLogger::operator<<("charly") is processed. 
[ 0 sec] MyLogger& MyLogger::operator<<("foo") is processed. 
     The return value is used for the next function. 
[ 0 sec] int sleep(10) is processed - this takes 10 seconds until the return 
     value is available 
[10 sec] MyLogger& MyLogger::operator<<(0) is processed 
     ("0" is the return value of sleep(10)) 
[10 sec] MyLogger& MyLogger::operator<<("bar") is processed 

但是什麼原因如初,MyLogger::operator<<("foo")後處理sleep(10)

+0

它似乎沒什麼特別的流,建立與普通方法相同的例子時,也是所有參數都首先計算...:■ – Charly

+0

'double x = 0; oClass.PrintAndIncrement(x).Print(sin(x));' 將輸出'0 0' ''double x = 0; oClass.PrintAndIncrement(X); oClass.Print(sin(x));' 打印'0 0.841472'。 – Charly

回答

1

這是可以接受的行爲,因爲它不以何種順序操作數指定爲「操作員< <」正在評估,和TTBOMK GCC常常做它以相反的順序來獲得正確的順序的參數到堆棧下一個函數調用。

認爲它在堆棧機方面:

push "charly" 
push oLogger 
call operator<< 
pop 
push "bar" 
push 10 
call sleep 
push "foo" 
push oLogger 
call operator<< 
call operator<< 
call operator<< 
pop 
相關問題