0

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

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

然后我的问题是:

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

我要实例化的类继承自一个抽象类。我正在使用 C++11,但之前显示的代码在没有 C++11 支持的情况下进行了测试。

对不起,如果我犯了任何英语错误

4

1 回答 1

3

进程之间不共享静态变量。每个进程都有自己的数据段,这是放置变量的地方。不管他们是const不是。

关于const_cast,您似乎对它的实际用途感到困惑。它能够从任何变量中删除const属性。它的全部意义在于让编译器允许写入变量。你可以在任何东西上使用它,你需要自己承担风险。如果你从一些真正不可写的东西中剥离出来,你就会陷入未定义的行为。constconst

变量具有通常的const static含义。它是静态的,并且是恒定的。类型无关紧要;const static intconst static A。对两者来说意味着同样的事情。

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

于 2013-06-14T05:47:20.130 回答