статическая константа для объекта в общей библиотеке в C ++. Это доля между процессами?

Я писал общую библиотеку на 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 НЕ работает должным образом с классами.

Тогда мои вопросы:

  1. Что делать const static модификаторы делают для экземпляра класса?
  2. Как я могу поместить экземпляр в общую библиотеку, чтобы делиться им с помощью разных процессов, загружая один раз и разделяя одну и ту же оперативную память?

Класс, который я хочу создать, наследует от абстрактного.
Я использую C ++ 11, но показанные ранее коды были протестированы без поддержки C ++ 11.

извините, если я допустил ошибку на английском

0

Решение

Статические переменные не распределяются между процессами. Каждый процесс получает свой собственный сегмент данных, в который помещаются переменные. Неважно, являются ли они const или нет.

О const_castВы, кажется, смущены тем, для чего это на самом деле. Это в состоянии удалить const атрибут из любой переменная. Весь смысл в том, чтобы компилятор разрешил запись в const переменная. Вы можете использовать это на чем угодно, и вы делаете это на свой страх и риск. Если вы лишите const из чего-то, что действительно не доступно для записи, вы в неопределенном поведении.

const static переменная имеет обычное значение. Это статично и постоянно. Тип не имеет значения; const static int или же const static A, Означает одно и то же для обоих.

Если вы хотите разделить объект между процессами, вам нужно будет поместить его в общую память POSIX и синхронизировать доступ к нему. Вы используете shm_open () для этого. Есть несколько уроков по общей памяти онлайн, например этот например.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]