何时计算参数,何时连接调用:obj.F1()。F2()。F3(sin(x))?

时间:2011-01-17 13:52:12

标签: gcc sleep iostream

我使用流媒体运营商(例如operator<<(const char*))进行记录。在我的单元测试中,我进行了如下测试:

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)之后处理?

1 个答案:

答案 0 :(得分:1)

这是可接受的行为,因为没有指定操作数为“operator&lt;&lt;”的操作数。正在评估,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