Форум программистов, компьютерный форум CyberForum.ru

Выделение статической памяти, не используя статические объекты - C++

Восстановить пароль Регистрация
 
relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
24.08.2014, 13:22     Выделение статической памяти, не используя статические объекты #1
Здравствуйте!

Как известно, когда мы объявляем статическую переменную, то компилятор выделяет ей место с самого начала, т. е. располагает в статической памяти, оптимизируя расположение. Однако, я не могу использовать модификатор static в моем случае. Есть ли какие-либо способы прокрутить то же самое, но без использования static?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2014, 13:22     Выделение статической памяти, не используя статические объекты
Посмотрите здесь:

C++ Константные статические объекты класса.
C++ статические и динамические объекты с++
C++ Выделение памяти (new)
C++ объекты классов в динамической памяти
Статические объекты C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
24.08.2014, 13:28     Выделение статической памяти, не используя статические объекты #2
Какая конкретно задача решается? "Хочу статик объект без static" - само по себе нонсенс.
relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
24.08.2014, 13:59  [ТС]     Выделение статической памяти, не используя статические объекты #3
Честно говоря, я уже решил проблему. Но то есть нельзя сделать так, чтобы мне была обязательно выделена память фиксированного размера в статической памяти при старте (без static), с которой я мог бы делать что угодно?

Вообще говоря, мне необходимо сделать некоторое действие, перед тем, как каждый мой объект, хранящийся в статической памяти, будет "отдеструктирован". По идее, я могу хранить некий Handle в статической памяти, а все то, что будет внутри, будет тоже в статической памяти, верно?
DrOffset
6425 / 3799 / 880
Регистрация: 30.01.2014
Сообщений: 6,592
24.08.2014, 14:03     Выделение статической памяти, не используя статические объекты #4
Цитата Сообщение от relationer Посмотреть сообщение
как каждый мой объект, хранящийся в статической памяти, будет "отдеструктирован
Почему нельзя делать это в деструкторе объекта?

И можно небольшой пример того, что хочешь получить? Возможно тогда можно будет что-то конкретное советовать.
relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
24.08.2014, 14:07  [ТС]     Выделение статической памяти, не используя статические объекты #5
Потому что деструкторы, по вероятности, будут определять пользователи. Мне необходимо, чтобы те части кода, которые зависят от того, что уничтожается в статической памяти, получили об этом уведомление и успели сделать то, что они хотят от этого объекта, перед тем, как этот объект будет уничтожен.

Правда же, я только что взял листок бумаги, и все аккуратно расписал, только еще не реализовал. Так что проблема, по идее, решена.
DrOffset
6425 / 3799 / 880
Регистрация: 30.01.2014
Сообщений: 6,592
24.08.2014, 14:15     Выделение статической памяти, не используя статические объекты #6
relationer, есть пара идей, но не могу их предлагать пока не буду уверен, что все именно так, как я понял. Поэтому все-таки хотелось бы пример.

Добавлено через 1 минуту
Цитата Сообщение от relationer Посмотреть сообщение
Так что проблема, по идее, решена.
Хотя если ты уверен. То ладно. Успехов.
Убежденный
Системный программист
 Аватар для Убежденный
14191 / 6206 / 985
Регистрация: 02.05.2013
Сообщений: 10,339
Завершенные тесты: 1
24.08.2014, 14:17     Выделение статической памяти, не используя статические объекты #7
Цитата Сообщение от relationer Посмотреть сообщение
Мне необходимо, чтобы те части кода, которые зависят от того, что уничтожается в статической памяти, получили об этом уведомление и успели сделать то, что они хотят от этого объекта, перед тем, как этот объект будет уничтожен.
Плохой дизайн.
Представьте: работаете вы, работаете, и тут откуда-то прилетает сообщение,
что объект, от которого вы зависите, собирается на пенсию, и нужно срочно
закрывать лавочку. Лучше бы решить зависимости через какой-нибудь
подсчет ссылок. А статические объекты вообще не трогать - пусть разрушаются
как им и положено, при завершении программы.
relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
24.08.2014, 14:29  [ТС]     Выделение статической памяти, не используя статические объекты #8
Пожалуй, я не совсем корректно выразился. Мне необходимо обработать зависимости между объектами, т. е. все, что разрушается, будет разрушаться уже во время завершения программы. Правда, один момент. Если я буду хранить объекты в статической памяти через handle, и вызывать деструкторы для других объектов, то получится, что мне никак не справиться с двойным вызовом delete.
Убежденный
Системный программист
 Аватар для Убежденный
14191 / 6206 / 985
Регистрация: 02.05.2013
Сообщений: 10,339
Завершенные тесты: 1
24.08.2014, 14:33     Выделение статической памяти, не используя статические объекты #9
Один вопрос: как вы собираетесь контролировать порядок разрушения объектов ?
relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
24.08.2014, 14:39  [ТС]     Выделение статической памяти, не используя статические объекты #10
Я пытаюсь сделать так, чтобы задавать это подобным образом:
C++
1
2
class MyEpicService : Service<MyEpicService, std::tuple<MyAnotherEpicService, MyDoubleEpicService>>
{ ... }
Все, что идет в std::tuple - типы синглтонов, от которых зависит данный синглтон.

Контролировать подобный порядок - это и есть корень моей проблемы. Пока пытаюсь решить с помощью техники handle. Все же хочется, чтобы синглтоны находились в статической памяти. Хотя, вероятно, не получится. Если только через еще один handle.
Убежденный
Системный программист
 Аватар для Убежденный
14191 / 6206 / 985
Регистрация: 02.05.2013
Сообщений: 10,339
Завершенные тесты: 1
24.08.2014, 15:26     Выделение статической памяти, не используя статические объекты #11
1) Выбросить все синглтоны и статические объекты.

Ибо:

- от них только лишние зависимости;
- проблемы с порядком удаления, не решаемые языковыми средствами;
- static-объекты висят в памяти до самого конца, даже если они больше не нужны.

2) Написать функции Initialize и Shutdown, куда переместить инициализацию и
очистку всех компонентов, требуемых для работы библиотеки. Обе функции сделать
реентрабельными, с подсчетом ссылок, как подобает хорошо спроектированным
библиотекам. Клиентам на C++ дать специальный враппер в стиле RAII (Initialize в
конструкторе и Shutdown в деструкторе).

3) Зависимости классов друг от друга решать через интерфейсы и подсчет ссылок.
При создании объекта давать ему одну ссылку. Для удаления использовать release, в
явном виде delete не звать. Если кто-то захочет пользоваться объектом дальше,
ему нужно будет прежде дополнительно зареференсить его, в итоге объект будет
жить столько, сколько нужно клиенту, до вызова release, освобождающего
последнюю ссылку.

4) Потенциальные циклические зависимости предугадывать и устранять еще на
стадии проектирования. Не должно быть возможности для классов А и Б взаимно
референсить друг друга.

5) Там, где пункт 4 невозможен, использовать strong reference / weak reference.

6) Все, что можно, позаворачивать в RAII-обертки, хелперы и абстрактные классы,
дать клиентам возможность настройки под свои нужды.

Не по теме:


Возможно, я несколько увлекся...

relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
24.08.2014, 15:44  [ТС]     Выделение статической памяти, не используя статические объекты #12
А можно привести пример какой-нибудь простенькой программы, которая использует архитектуру без синглтонов? Честно говоря, я с трудом понимаю, как это выглядит.
Убежденный
Системный программист
 Аватар для Убежденный
14191 / 6206 / 985
Регистрация: 02.05.2013
Сообщений: 10,339
Завершенные тесты: 1
24.08.2014, 15:53     Выделение статической памяти, не используя статические объекты #13
Контрвопрос: приведите пример программы, которая не может функционировать
без синглтонов. И я докажу вам, что они там не нужны.
relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
24.08.2014, 16:02  [ТС]     Выделение статической памяти, не используя статические объекты #14
Нет, я допускаю, что есть такие программы. Я не понимаю внутреннего взаимодействия компонентов. Если что-то нужно, синглтоном это будет выглядеть как Server.getData().getnanana. Как это будет выглядеть в программе без синглтонов?
Убежденный
Системный программист
 Аватар для Убежденный
14191 / 6206 / 985
Регистрация: 02.05.2013
Сообщений: 10,339
Завершенные тесты: 1
24.08.2014, 16:17     Выделение статической памяти, не используя статические объекты #15
C++
1
m_ServerData.getnanana();
или
C++
1
m_pServerData->getnanana();
или
C++
1
m_pSomeInterface->getnanana();
relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
24.08.2014, 17:50  [ТС]     Выделение статической памяти, не используя статические объекты #16
Что такое m_serverData и где он хранится, откуда получен?

Добавлено через 46 минут
Пример получше. Есть программа а-ля Excel. Нужно обратиться к данным в ячейке N,M. Как происходит запрос, как загружаются, инициализируются, где хранятся, как удаляются эти данные?
Убежденный
Системный программист
 Аватар для Убежденный
14191 / 6206 / 985
Регистрация: 02.05.2013
Сообщений: 10,339
Завершенные тесты: 1
24.08.2014, 18:25     Выделение статической памяти, не используя статические объекты #17
Цитата Сообщение от relationer Посмотреть сообщение
Что такое m_serverData и где он хранится, откуда получен?
Ну например, пусть это будет указатель на некий IServer или IServerData.
Хранится он в классе, как одно из полей. Получен во время инициализации,
при создании объекта класса. При таком подходе не нужен ни синглтон,
ни статические переменные, ни забота о порядке удаления (при условии,
что IServerData управляется через подсчет ссылок).

Кстати, подсчет ссылок легко обернуть в shared_ptr...

Добавлено через 11 минут
Цитата Сообщение от relationer Посмотреть сообщение
Пример получше. Есть программа а-ля Excel. Нужно обратиться к данным в ячейке N,M. Как происходит запрос, как загружаются, инициализируются, где хранятся, как удаляются эти данные?
C++
1
2
3
library MyLibrary;
library::app App = MyLibrary.connectToApp("Excel");
library::node Node = Excel.getNode(N,M);
Все
relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
24.08.2014, 18:47  [ТС]     Выделение статической памяти, не используя статические объекты #18
И что же такое Excel в данном контексте?
Убежденный
Системный программист
 Аватар для Убежденный
14191 / 6206 / 985
Регистрация: 02.05.2013
Сообщений: 10,339
Завершенные тесты: 1
24.08.2014, 18:55     Выделение статической памяти, не используя статические объекты #19
Цитата Сообщение от relationer Посмотреть сообщение
И что же такое Excel в данном контексте?
Опечатка. Собирался написать вот так:
C++
1
App.getNode(N, M);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2014, 21:16     Выделение статической памяти, не используя статические объекты
Еще ссылки по теме:

C++ delete[] статической памяти
Переменные в статической и динамической памяти! C++
C++ Возможно ли обращение к статической памяти функции извне?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,284
24.08.2014, 21:16     Выделение статической памяти, не используя статические объекты #20
Cинглтоны не нужны, есть же принцип инверсии зависимостей. Прокидывай абстрактные интерфейсы

Цитата Сообщение от relationer Посмотреть сообщение
Есть программа а-ля Excel. Нужно обратиться к данным в ячейке N,M. Как происходит запрос, как загружаются, инициализируются, где хранятся, как удаляются эти данные?
Контроллер должен знать о моделе
Yandex
Объявления
24.08.2014, 21:16     Выделение статической памяти, не используя статические объекты
Ответ Создать тему
Опции темы

Текущее время: 04:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru