c++ - 内联函数的函数本地静态对象是否在共享对象文件之间共享?
问题描述
我有一个inline
函数,其函数本地静态定义在头文件中,如下所示:
singleton.hpp
inline int& instance(){
static int v;
return v;
}
我包括header.hpp
两个独立的共享对象A.so
和B.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.so
并B.so
针对我的可执行文件main
。
问题:做A.so
和B.so
看到相同功能的本地静态对象?换句话说,如果我v
从A.so
like修改instance() = 42
,那是否可以从B.so
?
我实际上尝试过这个,它确实有效。但是,我不确定这是否是某些特定于实现的行为或未定义的行为。有关完整示例,请参阅https://github.com/jrhemstad/link_test。
解决方案
c++中inline的含义与C中的用法不同。见c++中的inline
从 c++17 开始,规范定义了内联函数
所有函数定义中的函数局部静态对象在所有翻译单元之间共享(它们都引用在一个翻译单元中定义的同一对象)
对于纯“内联”,这是可行的,但对于“静态内联”,至少 g++ 仍会创建静态对象的多个副本。
推荐阅读
- java - 使用 Parcelable 有什么好处?
- html - 我可以在 CSS Grid 中用作主网格容器吗?
- javascript - 如何使用跨度标签附加速度控制Javascript onmousemove,因此每个附加跨度标签都没有空间
- registration - 具有低(且无法识别)特征的点云注册
- java - Android Java MVC结构
- spring-boot - 在非 spring-boot 应用程序中从 spring-boot-actuator 公开缓存端点
- asp.net-mvc - 带有 Javascript 变量的 MVC Url Helper
- sql - SQL Inner Join 组合结果中的行 - 结果太少
- c - 在 execve sys_call 中处理用户 argv 的问题
- sass - SASS 目标:如果存在另一个类,则在标记之前