[英]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
修饰符对类的实例有什么作用? 我要实例化的类是从抽象类继承的。 我正在使用C ++ 11,但是之前显示的代码未经C ++ 11支持进行了测试。
抱歉,如果我犯了任何英语错误
静态变量不在进程之间共享。 每个进程都有自己的数据段,在该数据段中放置变量。 它们是否为const
无关紧要。
关于const_cast
,您似乎对其实际用途感到困惑。 它能够从任何变量中删除const
属性。 这样做的全部目的是使编译器允许写入const
变量。 您可以在任何东西上使用它,风险自负。 如果从真正不可写的内容中删除const
,则会陷入未定义的行为。
const static
变量具有通常的含义。 它是静态的,并且是恒定的。 类型无关紧要; const static int
或const static A
两者的意思相同。
如果要在进程之间共享对象,则需要将其放入POSIX共享内存并同步对其的访问。 为此使用shm_open()。 在线上有一些有关共享内存的教程,例如这一本 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.