2013-06-14 2 views
0

Я писал общую библиотеку на C++, но хочу поделиться некоторым экземпляром класса через пользователей библиотеки. Я имею в виду, что объект только для чтения загружается всего один раз из библиотеки и используется каждым процессом, связанным с библиотекой.static const для объекта в общей библиотеке в 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. Как я могу поместить экземпляр в общей библиотеке, чтобы разделить его с помощью разных процессов, загружая один раз и разделяя одну и ту же RAM-память?

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

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

+0

«* Я смог изменить данные const!» *. Компилятор Pesky обманул вас! Это невероятно! –

+0

@Asha Я читал об этом, но как я могу узнать, есть ли объект или нет в постоянной памяти и разделен между обработкой? – Daniel

ответ

3

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

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

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

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

+0

OK Спасибо! Я знаю, что const_cast удаляет атрибут const при взгляде компилятора, но я подумал (видимо, неправильно), что ОС останавливает меня, если я пытаюсь изменить данные (как в первом примере). Итак, если я поставил очень большой двоичный массив в секции const библиотеки, он будет скопирован в любой процесс? – Daniel

+0

@ Даниэль Да, каждый процесс всегда получает свою собственную копию всех статических переменных. –

+0

Отлично. Большое вам спасибо за ответы! Хорошего дня! – Daniel

 Смежные вопросы

  • Нет связанных вопросов^_^