![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
borisbn |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Здравствуйте.
Имеется статический массив объектов
Object наследуется от интерфейса IFace
В функции Object::foo() мне нужно узнать свои индексы в массиве s_objects. Делаю я это так
Меня терзают смутные сомнения: - правомерна ли такая запись ? - будет ли это работать на всех платформах, на всех компиляторах, при всех настройках компиляции ? Ещё меня смущает, что Object::foo() будет вызываться из кода, который знает только о IFace. Т.е. как-то так
Заранее спасибо. P.S. Хранить в Object свои индексы - не предлагать, т.к. этих объектов будет огромное количество (суммарно более 4 ГБ) и увеличивать класс на 3 int'а я уже не могу. Добавлено через 5 минут и 50 секунд P.P.S. А может кто-нибудь подскажет мне в связанной с этим вопросом теме - http://forum.vingrad.ru/forum/topic-353079.html ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||||
|
|||||||||
Randajad |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
Правомерно.
|
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
borisbn, а какова необходимость именно в непрерывном массиве?
То что ваш код, приведенный здесь, будет работать только при непрерывном массиве, это понятно. Есть ли какие -то другие веские причины, почему нужен именно непрерывный массив. Если веских причин в непрерывном массиве нет, то решится первая проблема и будем решать эту. (чуток по другому). зы: в любом случае (непрерывный или прерывный), синтаксис будет одинаков: objects [i][j][k]; |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
В принципе, необходимости нет. Однако, я бы хотел, чтобы получение этих индексов было бы максимально быстрое, поэтому и сделал массив непрерывным. В общем, суть задачи такова: 1) мне заранее известно количество этих объектов (а именно: кол-во строк, столбцов и ... как бы обозвать... кол-во таблиц) 2) в функции foo() мне необходимо знать № таблицы, № строки и № столбца объекта, у которого эта foo() вызвана 3) хранить эти индексы в объекте я не могу (и так много памяти кушаю) P.S. я бы хотел на этапе компиляции/линковки знать, что память будет выделена. Не хотелось бы узнать о нехватке памяти в рантайме...
у меня как раз обратная задача - по имеющемуся указателю вычислить i, j и k Это сообщение отредактировал(а) borisbn - 1.7.2012, 13:54 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
borisbn, я чуток подумал. Действительно вычислить индекс по адресу, можно оптимально только при непрерывном массиве. Вначале думал просто сделать массив указателей на указатели на s_objects [] Но там вычисление индексов будет не простым. Понадобится что-то типа двух дополнительных индексов (map'ов) , размерами один I, другой J. (впрочем это относительно не много) + время на доступ к этим мапам. В общем, не знаю. Как крайний вариант, если не выйдет выделить весь массив сразу, могу накалякать версию с двумя мапами. Если хотите. Или вас это в принципе не устроит? Это сообщение отредактировал(а) volatile - 1.7.2012, 16:04 |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
спасибо, но я думаю, что справлюсь )) Что ж... раз все считают такую конструкцию правомерной, то ИМХО нечего выдумывать... оставлю так. Единственное, что меня беспокоит, так это то, что мне могут просто не дать выделить такой большой массив в статической памяти... Хотя... не беда. Я ж могу и в динамической памяти выделить непрерывный участок... Опять же - если дадут. Всем спасибо. Закрываю, но хотелось бы услышать советы по соседней теме - http://forum.vingrad.ru/forum/topic-353079.html -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
||||
|
||||
Randajad |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
Такого не бывает. Все узнается только в рантайме. Даже если линкер и запишет размер памяти, которая нужна, не факт, что OS при запуске вашей программы не пошлет ее далеко. |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Randajad, borisbn просто не совсем точно выразился. в соседней темке, он объяснил Это сообщение отредактировал(а) volatile - 1.7.2012, 18:52 |
|||
|
||||
mes |
|
||||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
при множественном наследовании не всегда.. Добавлено через 5 минут и 57 секунд
почему бы не так :
Добавлено через 10 минут и 58 секунд
а нужно ли хранить сами обьекты, может приспособленца (flyweight pattern) взять в помощь ? |
||||||||
|
|||||||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Потребности в памяти уменьшатся - в ObjectData не будет указателя на таблицу виртуальных методов, но потеряешь в скорости (на каждом обороте цикла объект создаётся заново) |
|||
|
||||
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
![]() как Вы понимаете, в настоящей программе у меня переменные немного по-другому называются ![]() ясно. спасибо. учту. на самом деле, тот, кто вызывает foo() ничего об этом статическом массиве не знает. У него есть только указатель, да и то на базовый класс.
первый раз слышу. /me пошёл читать про flyweight pattern math64,
Добавлено через 12 минут и 14 секунд Кажется, не подойдёт, т.к. я не хочу выделять память под каждый объект из-за накладных расходов. вот - http://fahrenheit2539.blogspot.com/2012/05...ield-study.html - недавно прочитал про накладные расходы в new и ужаснулся... оттуда и задумался о большом статическом массиве -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
http://en.wikipedia.org/wiki/Flyweight_pattern
borisbn, В моём варианте Object - временный объект (ну, чтобы удовлетворить Вашему требованию переименуем его в XObject), в приведённом мной цикле он существует в одном экземляре внутри цикла, добавленние в него индексов не увеличивает потребление памяти в программе, а за счёт того, что в большом массиве будет не объект, а структрура без таблицы виртуальных методов (её можно ещё упаковать, если возможно), потребление памяти уменьшается. Но объект нужно конструировать каждый раз заново, когда он понадобится и удалять по ненадобности (данные, по которым можно восстановить объект, сохраняются) - скорость выполнения уменьшится. Это тоже паттерн проектирования, но как он называется, не помню. |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Почитал про FlyWeightPattern - фактически, мой код - его упрощенная версия, new, как видите, не обязателен. Важно выделить из объекта упакованные данные, по которым всегда можно восстановить объект и тогда объект нужно создавать только тогда, когда он нужен для работы.
|
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
опубликуйте задачу, которую Вы пытаетесь решить таким замысловатым способом, тогда возможно можно будет более точно сказать, что подходит, а что нет..
опять игра слов.. статический массив или массив в статической памяти ![]() |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |