作者:mobiledu2502902687 | 来源:互联网 | 2022-12-08 14:57
在下面的示例代码中,我想知道两次调用log_cref_address
何时可靠地打印相同的地址.
#include
#include
#include
using namespace std;
void log_cref_address(const int& t) {
cout <
void foo() {
log_cref_address(i); // different if foo called from different threads
thread([] { log_cref_address(i); }).join(); // same if already in thread
thread(log_cref_address, i).join(); // same if already in thread
cout <: "; foo<0>();
cout <<"foo<0>: "; foo<0>();
cout <<"foo<1>: "; foo<1>();
cout <(); }).join();
cout <<"bind(): "; thread(bind(foo<0>)).join();
return 0;
}
在我的机器上,main
打印
foo<0>: 0x7fff7cf5507c 0x7fa0585b5e1c 0x196fc28
foo<0>: 0x7fff7cf5507c 0x7fa0585b5e1c 0x196fc28
foo<1>: 0x7fff7cf5507c 0x7fa0585b5e1c 0x196fc28
lambda: 0x7fa0585b5dcc 0x7fa057db4e1c 0x7fa0500008c8
bind(): 0x7fa0585b5d1c 0x7fa057db4e1c 0x7fa0500008c8
从这样的许多输出中,我观察到的main
行为如下:
前三个调用foo
打印相同的地址.
最后两次调用foo
(来自线程)打印的地址不是前三次调用打印的.
在最后两次调用中foo
,log_cref_address
当且仅当从子线程调用时才打印相同的地址.
在任何机器上,C++标准都保证了哪些(如果有的话)这些行为?
1> geza..:
他们都不是.该标准不保证临时变量的地址.