内联函数的函数本地静态对象是否在共享对象文件之间共享?

时间:2020-06-12 01:28:44

标签: c++

我有一个inline函数,该函数在标头中定义了函数本地静态,如下所示:

singleton.hpp


inline int& instance(){
   static int v;
   return v;
}

我将header.hpp包含在两个独立的共享对象A.soB.so中。

A.so

#include "singleton.hpp"

namespace A{

void set(int v){
    instance() = v;
}

int get(){
    return instance();
}

}

B.so

#include "singleton.hpp"

namespace B{

void set(int v){
    instance() = v;
}

int get(){
    return instance();
}

}

main.cpp


#include "a.hpp"
#include "b.hpp"
#include <iostream>

int main(void){
    A::set(42);
    std::cout << B::get() << std::endl;

    B::set(13);
    std::cout << A::get() << std::endl;
}

我同时将A.soB.so链接到我的可执行文件main

问题A.soB.so是否看到相同的函数局部静态对象? 换句话说,如果像v那样从A.so修改instance() = 42,从B.so可以看到吗?

我实际上尝试过,并且确实确实有效。但是,我不确定这是特定于实现还是未定义的行为。有关完整示例,请参见https://github.com/jrhemstad/link_test

1 个答案:

答案 0 :(得分:0)

c ++中内联的含义不同于C中的内联。请参见inline in c++

从c ++ 17开始,规范就为内联函数定义了

所有函数定义中的局部函数静态对象在所有翻译单元之间共享(它们均引用一个翻译单元中定义的同一对象)

对于纯“内联”,它可以工作,但对于“静态内联”,至少g ++仍会创建静态对象的多个副本。

相关问题