我使用流媒体运营商(例如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)
之后处理?
答案 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