首页 > 解决方案 > 内联函数的函数本地静态对象是否在共享对象文件之间共享?

问题描述

我有一个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看到相同功能的本地静态对象?换句话说,如果我vA.solike修改instance() = 42,那是否可以从B.so?

我实际上尝试过这个,它确实有效。但是,我不确定这是否是某些特定于实现的行为或未定义的行为。有关完整示例,请参阅https://github.com/jrhemstad/link_test

标签: c++

解决方案


c++中inline的含义与C中的用法不同。见c++中的inline

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

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

对于纯“内联”,这是可行的,但对于“静态内联”,至少 g++ 仍会创建静态对象的多个副本。


推荐阅读