静态const到C ++中共享库中的对象。它是在进程之间共享的吗?

时间:2013-06-14 05:17:38

标签: c++ static shared-libraries const const-cast

我一直在用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内存?
  3. 我想要实例化的类继承自抽象类。 我正在使用C ++ 11,但之前显示的代码在没有C ++ 11支持的情况下进行了测试。

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

1 个答案:

答案 0 :(得分:3)

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

关于const_cast,您似乎对其实际存在的内容感到困惑。它可以从任何变量中删除const属性。它的重点是让编译器允许写入const变量。你可以在任何事情上使用它,你自己承担风险。如果将const从真正不可写的内容中剥离出来,则会导致未定义的行为。

const static变量具有通常的含义。它是静态的,而且是不变的。这种类型并不重要; const static intconst static A。对两者来说意味着同样的事情。

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