Я писал общую библиотеку на 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 не работает должным образом с классами.
Тогда мои вопросы:
- Что означают
const static
модификаторы делают к экземпляру класса? - Как я могу поместить экземпляр в общей библиотеке, чтобы разделить его с помощью разных процессов, загружая один раз и разделяя одну и ту же RAM-память?
Класс, который я хочу создать, наследуется от абстрактного. Я использую C++ 11, но коды, показанные ранее, были протестированы без поддержки C++ 11.
извините, если я сделал какой-либо английский ошибку
'const_cast (& a) -> x = 2;' - неопределенное поведение. Может случиться что-нибудь, включая установку значения до 2. – Asha
«* Я смог изменить данные const!» *. Компилятор Pesky обманул вас! Это невероятно! –
@Asha Я читал об этом, но как я могу узнать, есть ли объект или нет в постоянной памяти и разделен между обработкой? – Daniel