繁体   English   中英

C ++共享库中对象的静态常量。 进程之间共享吗?

[英]static const to an object in a shared library in C++. Is it share between processes?

我一直在用C ++编写共享库,但是我想通过库的用户共享类的某些实例。 我的意思是,只读对象仅从库中加载一次,并由链接到库的每个进程使用。

据我所知,这可以使用conststatic 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修饰符不适用于类。

然后我的问题是:

  1. const static修饰符对类的实例有什么作用?
  2. 我如何才能将实例放入共享库中,以通过不同的进程共享它,加载一次并共享相同的RAM内存?

我要实例化的类是从抽象类继承的。 我正在使用C ++ 11,但是之前显示的代码未经C ++ 11支持进行了测试。

抱歉,如果我犯了任何英语错误

静态变量不在进程之间共享。 每个进程都有自己的数据段,在该数据段中放置变量。 它们是否为const无关紧要。

关于const_cast ,您似乎对其实际用途感到困惑。 它能够从任何变量中删除const属性。 这样做的全部目的是使编译器允许写入const变量。 您可以在任何东西上使用它,风险自负。 如果从真正不可写的内容中删除const ,则会陷入未定义的行为。

const static变量具有通常的含义。 它是静态的,并且是恒定的。 类型无关紧要; const static intconst static A 两者的意思相同。

如果要在进程之间共享对象,则需要将其放入POSIX共享内存并同步对其的访问。 为此使用shm_open()。 在线上有一些有关共享内存的教程,例如这一本

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM