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

标签 c++ static shared-libraries constants 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 修饰符不能与类一起正常工作。

那么我的问题是:

  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() 。网上有一些关于共享内存的教程,比如this one例如。

关于c++ - C++ 中共享库中对象的静态常量。进程间共享吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17101543/

相关文章:

c++ - CreateStreamOnHGlobal() 段错误

delphi - 是否有静态构造函数/析构函数帮助主题

java - 使用变量/静态变量到 'name' 值以提高可读性

php - 公共(public)静态变量值

c - gcc __attribute__((constructor)) 到底什么时候运行?

c - 如何在库加载时将参数传递给构造函数?

c++ - 如何更改 Win32 API 应用程序中的控件主题?

c++ - 如何在 C++ 中遍历数字列表

haskell "libraries"

c++ - 将 Eigen::ArrayXXd 转换为 Eigen::MatrixXd