|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
26.01.2012, 10:02 | #1 |
Пользователь
Регистрация: 18.03.2011
Сообщений: 47
|
Как сэкономить память?
#define PORTS 260
#define MAX_NUMBER_OF_ENTRIES 255 Есть у нас такой интересный указатель: STRUCT_T (*location)[MAX_NUMBER_OF_ENTRIES]; Под него выделалясь память: location = (STRUCT_T (*)[MAX_NUMBER_OF_ENTRIES]) malloc( sizeof(STRUCT_T) * PORTS * MAX_NUMBER_OF_ENTRIES ); location[PORT][ENTRY].a = 4; location[PORT][ENTRY].b = 5; ... И так далее.. Как видно что у нас выделется память под PORTS * MAX_NUMBER_OF_ENTRIES позиций. Теперь представьте что нам из PORTS нужны только 3 штуки, выделять память под остальные абсолютно не требуется. Вопрос, как реализовать это, оставляя интексацию по типу переменной location неизменной? Было предложено такое решение: Объявить указатель следующим образом: STRUCT_S_T *location; typedef STRUCT_T *STRUCT_S_T[MAX_NUMBER_OF_ENTRIES]; Всё, далее у меня начались затруднения с реализацией, а главное из них, "Как выделить память под location? Исходя из того что PORTS = 3" И чтобы обращаться к ней так: location[123][ENTRY].a = 4; location[56][ENTRY].a = 5; location[32][ENTRY].a = 5; ------- Заранее спасибо за помощь! |
26.01.2012, 10:21 | #2 |
Форумчанин
Регистрация: 09.10.2010
Сообщений: 217
|
Код:
PORT23------PORT54 |____________| ENTRY1_____ENTRY3 A=2________A=5 |___________ ENTRY2 A=4 | ENTRY3 A=2
Ёж птица гордая, пока не пнешь не полетит.
|
26.01.2012, 12:37 | #3 |
Пользователь
Регистрация: 18.03.2011
Сообщений: 47
|
Да, конечно же так можно. Но мне нужно имеено поддержать предложенное решение, внося как можно меньше своих изменений, так что вариант со списками сразу отпадает..
Так же не подходит решение с realloc. Нужно именно воспользоваться хитрым typedef и залоцировать память только для трёх позиций. |
26.01.2012, 12:40 | #4 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Код:
|
26.01.2012, 13:29 | #5 |
Пользователь
Регистрация: 18.03.2011
Сообщений: 47
|
нет, индексация должна быть сохранена.
|
26.01.2012, 14:27 | #6 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Если тебе нужно только 3 элемента, то и выделять память нужно только под 3 элемента. Иначе, ты никак не сможешь сэкономить память.
Другое дело, что ты можешь подтасовать сами индексы локаций: Код:
А вот индексы для обращения к элементам пропускаются через специальные функции-конверторы, логику которых можно запилить как угодно. Результат работы этих конверторов - числа от 0 до 2. |
26.01.2012, 14:40 | #7 |
Пользователь
Регистрация: 18.03.2011
Сообщений: 47
|
Маппинг не приветствуется, это тоже было оговорено. нужно именно выделить память. чтобы пулл был один, а указателя на него три...
|
26.01.2012, 16:39 | #8 |
Старожил
Регистрация: 19.08.2009
Сообщений: 2,119
|
Unmanner
Есть у нас такой интересный указатель: STRUCT_T (*location)[MAX_NUMBER_OF_ENTRIES]; ... Было предложено такое решение: Объявить указатель следующим образом: STRUCT_S_T *location; надеюсь, ты понимаешь, что в первом случае мы имеем дело с указателем на массив элементов, во втором - с указателем на элемент. Из этого выплывают твои проблемы с индексацией. Отсюда вывод: если работаем на C++, то завернуть все это дело в класс с перегруженным оператором []. использовать "разреженный массив". если работаем на Си, то расслабиться и ничего не делать - с учетом озвученных ограничений задача неразрешима.
А вы почему со мной не соглашаетесь, у вас что, импотенция? (c) ACE Valery
|
26.01.2012, 19:10 | #9 |
Пользователь
Регистрация: 18.03.2011
Сообщений: 47
|
вообще у этих элементов разные типы. юзать си++ нельзя, так как это рабочий момент. если не разрешима то меня уволят...
|
26.01.2012, 19:28 | #10 |
Старожил
Регистрация: 19.08.2009
Сообщений: 2,119
|
Unmanner
вообще у этих элементов разные типы. я кагбэ в курсе что это разные типы. location[123][ENTRY].a = 4; Нужно именно воспользоваться хитрым typedef налицо путаница с тем, как работает адресная арифметика Теперь представьте что нам из PORTS нужны только 3 штуки, какие номера этих ports? или они тоже все время разные? зачем экономить память? почему нельзя применить все техники, описанные выше? случай начальника-самодура что-ли? тогда лучше увольняйся сам, чё толку делать в этой шаражке.
А вы почему со мной не соглашаетесь, у вас что, импотенция? (c) ACE Valery
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как не затратить память | pray_driver | HTML и CSS | 4 | 14.06.2011 21:34 |
Как улучшить память?:-) | Kudryavtsev | Свободное общение | 38 | 09.05.2011 20:27 |
Как выделить память 750mb? | VintProg | Общие вопросы Delphi | 10 | 29.06.2009 20:30 |
Как чистить оперативную память??? | Altera | Операционные системы общие вопросы | 10 | 16.05.2008 14:52 |