C ++: сохранить глобальное значение по адресу памяти - или альтернативным способом

В настоящее время я настраиваю код пиксельного шейдера, написанный на C ++ для компьютерной игры. Мне нужен способ сохранить глобальное значение (целое число или число с плавающей запятой) таким образом, чтобы его можно было получить позже (в том же процессе). Поскольку во время выполнения кажется, что все выполняется «без сохранения состояния», простое объявление и использование статической переменной (переменной класса) не поможет, как я обычно поступал бы в этой ситуации.

Таким образом, я натолкнулся на идею сохранить свое глобальное значение по определенному адресу памяти и получить его оттуда позже. Моя проблема в том, что я не знаю, возможно ли это вообще и как это сделать. Я прочитал эти вопросы, но пока не нашел ответа:

Создать новый объект C ++ по определенному адресу памяти?

Указатель на определенный фиксированный адрес

Назначение определенного адреса памяти из другой программы , и изменив его значение

Присвойте значение определенному адресу

Возможно ли это даже в Windows Vista или 7, и если да, то как? У меня нет возможности включать какую-либо библиотеку, но мне нужно добиться чего-либо с помощью встроенных функций C ++.

Если это не (или нелегко) достижимо, существуют ли альтернативные способы хранения некоторого значения действительно глобально (не как переменная класса), чтобы к нему могли получить доступ другие классы / экземпляры в том же процессе? Может быть, какой-то кеш сеанса или приложения, как в .NET или Java?

Любая помощь будет оценена по достоинству.


person Meltac    schedule 22.08.2011    source источник
comment
Что вы имеете в виду под «кажется, выполняется без гражданства»? И как данные, хранящиеся по определенному адресу памяти, отличаются от любой другой обычной глобальной переменной?   -  person Karl Knechtel    schedule 22.08.2011
comment
Я, наверное, что-то упускаю, но разве глобальная переменная не решение?   -  person Drakosha    schedule 22.08.2011
comment
Карл, я имею в виду, что код, кажется, выполняется не так, как в обычном приложении c ++, где скомпилированные классы загружаются в кучу (или стек? Не помню), и все статические переменные также хранятся там и поэтому доступен из всех экземпляров класса. В моем случае кажется, что каждый экземпляр класса запускается в отдельной области памяти, и даже сам класс со всеми статическими переменными загружается для каждого экземпляра в отдельную память, а не только один раз для всех. Таким образом, ключевое слово static не ведет себя должным образом, оно не статично для всех экземпляров.   -  person Meltac    schedule 23.08.2011
comment
Дракоша, пожалуйста, прочтите мой вышеупомянутый комментарий о том, чего вам не хватает. Обычно решением по умолчанию является глобальная переменная. К сожалению, не в этом случае из-за особой обработки памяти.   -  person Meltac    schedule 23.08.2011


Ответы (1)


Должен признать, я не понял, почему статика не работает в вашем случае, поэтому мое предложение также может не сработать. Можно ли просто использовать синглтон, например:

class VariableStorage
{
public:
    int getVar(string name);
    void setVar(string name, int value);

    static VariableStorage* instance();

    //...

protected:
   VariableStorge() { static obj = 0; if(!obj) obj = new VariableStorage(); return obj; }
   // ...
}
person pokey909    schedule 22.08.2011
comment
Спасибо, но боюсь, что в моем случае это не поможет, потому что вы тоже используете статику. Или вы имеете в виду, что указатель-указатель (*) должен помочь здесь? - person Meltac; 23.08.2011