static const转换为c++共享库中的对象.是进程间共享的吗?
static const to an object in a shared library in C++. Is it share between processes?
我一直在用c++编写一个共享库,但是我想通过库的用户共享类的一些实例。我的意思是,一个只读对象,只从库中加载一次,并被链接到库的每个进程使用。
据我所知,这可以使用const
或static const
,但它不像预期的那样工作。
#include <iostream>
static const int x = 1;
int main()
{
std::cout << x << std:endl;
*(const_cast<int *>(&x)) = 2;
std::cout << x << std:endl;
return 0;
}
使用GCC 4.8.1代码编译得很好,但是,显然,它在运行时失败,因为x
变量是只读的(它在我的Linux上产生分段错误)。
#include <iostream>
struct A
{
A() : x(1) {}
int x;
}
static const A a;
int main()
{
std::cout << a.x << std:endl;
const_cast<A *>(&a)->x = 2;
std::cout << x << std:endl;
return 0;
}
最后的代码编译并运行良好。可执行文件打印
1
2
我可以修改const数据了!所以我猜const修饰符不能正常工作与类。
那么我的问题是:
-
const static
修饰符对类的实例做什么? - 我怎么能把一个实例在共享库中通过不同的进程共享它,加载一次并共享相同的RAM内存?
我要实例化的类继承自一个抽象类。我正在使用c++ 11,但前面显示的代码是在没有c++ 11支持的情况下测试的。
对不起,如果我犯了任何英文错误
静态变量不能在进程之间共享。每个进程都有自己的数据段,这是放置变量的地方。它们是不是const
并不重要。
关于const_cast
,你似乎对它的实际用途感到困惑。它能够从任何变量中删除const
属性。它的全部意义在于让编译器允许写入const
变量。你可以在任何地方使用它,风险自负。如果你从不可写的东西中去掉const
,你就进入了未定义行为。
const static
变量具有通常的含义。它是静态的,也是恒定的。类型不重要;const static int
或const static A
。
如果您想在进程之间共享对象,那么您需要将它放入POSIX共享内存并同步对它的访问。为此使用shm_open()。网上有一些关于共享内存的教程,例如:
相关文章:
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 如何创建一个共享对象与另一个.所以在Cmake
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- 在 Android Studio 中使用 C++ 共享对象时出现问题
- 共享对象、符号、C/C++ 库链接和加载
- ./main:加载共享库时出错:libopencv_highgui.so.4.0:无法打开共享对象文件:没有这样的文件或
- 在 win32 上生成 R 包:无法加载共享对象 (.dll)
- 共享对象中的符号
- sf::Windows上的音乐:api-ms-win-crt-locale-l1-1-0.dll:无法打开共享对象文件
- C++ 为什么要级联共享对象链接
- 加载共享库时出错:libbsoncxx.so._noabi:无法打开共享对象文件:没有此类文件或目录
- 从单个.cpp构建共享对象
- 与 32 位共享对象的链接问题
- 卸载共享对象(.so 文件)在 C++ 中用 dlopen() 打开
- 运行程序时找不到共享对象库,但在编译过程中链接了它
- 错误:无法打开共享对象文件:没有此类文件或目录
- Qt 创建器:将库移动到 subdir 后无法打开共享对象文件
- 共享对象中的符号名称与文件中.cpp函数不同
- C++:在共享对象中调用抽象基类构造函数/未定义的符号
- Cython:共享对象中未定义的符号