代码之家  ›  专栏  ›  技术社区  ›  Taylor Nichols

常量引用函数参数的地址何时唯一?

  •  0
  • Taylor Nichols  · 技术社区  · 7 年前

    在下面的示例代码中,我想知道 log_cref_address 将可靠地打印相同的地址。

    #include <iostream>
    #include <thread>
    #include <functional>
    
    using namespace std;
    
    void log_cref_address(const int& t) {
        cout << addressof(t) << ' ';
    }
    
    template <int i>
    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 << endl;
    }
    
    int main() {
        // first three calls print identical addresses
        cout << "foo<0>: "; foo<0>(); 
        cout << "foo<0>: "; foo<0>();
        cout << "foo<1>: "; foo<1>();
        cout << endl;
        // last two from thread yields different addresses from the first three
        cout << "lambda: "; thread([] { foo<0>(); }).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
    

    从许多类似的输出中,我观察到 主要的 行为如下:

    1. 前三个电话 foo 打印相同的地址。
    2. 最后两个电话 (从线程)打印前三个调用未打印的地址。
    3. 在最后两个电话里 , 日志地址 如果且仅当从子线程调用时,打印相同的地址。

    在任何机器上,这些行为中的哪些(如果有的话)由C++标准保证?

    1 回复  |  直到 7 年前
        1
  •  5
  •   geza    7 年前

    他们都没有。标准不保证临时变量的地址。

    推荐文章