LINUX.ORG.RU

Сломал мозг

 


0

4

Возвращаясь к предыдущей теме: http://www.linux.org.ru/forum/development/9153691

Этот подход получился неудачным.
Поэтому попробую заново сформулировать вопрос по-другому.

Есть 10-20 материалов, у которых есть свойства p1, p2, ...
(в зависимости от материала набор этих свойств может отличаться).
Это можно задать через struct mat{...}. Также у каждого материала есть вычисляемые функции, т.е. методы (у каждого они разные).
Можно все это обернуть в class на основе виртуального класса.

Все эти материалы нужно будет передавать в процедуру.
Т.к. количество материалов может быть разной,
то необходимо их передавать либо в виде списков, массивов или еще как-то.

Проблема возникает когда я хочу передать массив структур в процедуру, т.к. класс является виртуальным.

Каким методом все это реализовать, чтобы получался код наглядным и простым?
С помощью каких элементов с++ это лучше всего будет сделать. В основном интересует сам подход.

З.ы. Если это возможно, то в рамках стандартного с++98.

★★★★★

Ответ на: комментарий от indie

Оверх памяти, оверхед на процессорное время по сравнению с моим кодом. УЖ про соотношение перфоманс/память я вообще молчу.

А вообще как хотите.

superhackkiller1997
()
Ответ на: комментарий от indie

Т.е. если код ест больше памяти( в разумных пределах) и работает быстрее, то это хорошо. Если код жрёт больше памяти и работает медленнее - это не код, а какуля.

superhackkiller1997
()
Ответ на: комментарий от superhackkiller1997

Ты берёшь конструируешь по 1к елементов каждого типа добавляешь их последовательно в хранилище.


Уточни как
1000xelem1 1000xelem2 1000xelem3 1000xelem4
или
1000x(elem1 elem2 elem3 elem4)
?

indie
()
Ответ на: комментарий от superhackkiller1997

давай рандомом

в зависимости от результата rand() % 4 ты вы бираешь какой элемент сейчас добавить. В результате должно быть N * elem1 + M * elem2 + K * elem3 + L * elelm4 == 4000 елементов в контейнере

indie
()
Последнее исправление: indie (всего исправлений: 1)
Ответ на: комментарий от indie

Нет, ты делаешь массивчик из 20елементов в которых ты рандомно распределяешь номера своих типов, должно быть по 5каждого типа.

Потом этим ты заплоняешь. Это будет рандомно, но и не будет тормазить как ранд.

superhackkiller1997
()
Ответ на: комментарий от superhackkiller1997

хороший ответ. но есть несколько вопросов:

У тебя памяти в среднем 36бит максимум

36 бит?

допустим у нас имеется 30 гигабайт памяти, приложение заняло 29 гигабайт памяти читая данные от очень упорного пользователя. затем запускаем вторую копию приложения в надежде ввести 2 записи, закрыть первое приложение и продолжить ввод во втором приложении. malloc на большой кусок памяти завершается провалом, проверок нет, память не выделена. что делать? (первым приложением может быть совершенно посторонняя задача)

это к тому, что память (на момент запуска программы) может быть занята и malloc на большой размер завершится провалом. хотя маленькими фрагментами вполне можно захватывать память, при этом надеяться на скорейшее освобождение памяти другими процессами.

anonymous
()
Ответ на: комментарий от superhackkiller1997

какая разница, если обе программы будут тормозить на rand одинаково? на результат исполнения не повлияет

Нет, ты делаешь массивчик из 20елементов в которых ты рандомно распределяешь номера своих типов, должно быть по 5каждого типа.


То есть ты все же rand хочешь использовать или нет? и почему 20 елементов уже?

indie
()
Ответ на: комментарий от indie

Я не знаю сколько ранд будет тратить моих регистров, я не знаю что там он делает - мне лениво страдать этой фигнёй.

Патамучто кешлайн, патамучто 20 делится на 4, а 4к делится на 20.

Я хочу использовать рандом, но ранд на каждый елемент тут не нужен. 20елементов вполне хватит.

superhackkiller1997
()
Ответ на: комментарий от anonymous

Ой, как всё запущенно. Давай я тебе расскажу.

Вся память физическая и вартуальная поделена на страницы.

В камне и вдере есть такой механизм, который связывает виртуальную страницу с фузической.

Аллокатор тебе выделяет N последовательных страниц в виртуальном пространстве твоей программулины. Допустим ты сделал маллок на 100*размер_страницы.

При обращении к адресу, который пренадлежит 1-й странице ведро связывает твою страницу с реальной страницей и процессор транслирует виртуальный адрес в реальный, при последующем твоём обращении к этом странице.

так же происходит с каждыми последующими страницаи.

Виртуальных страниц у тебя в миллионы раз больше, чем физических, а маллок выделяет виртуальные.

Никаких маленьких кусочков не бывает, никакой «высвобождения» не бывает. Если ты обратишься к виртуальной странице, а в пуле «ведра» не будет свободных физических страниц, то оно пойдёт в район ООМкиллера и кильнёт твою 29гиговую байду.

Прочитай это и задавай ещё раз вопрос.

Почему 36бит ты узнаешь из cat /proc/cpuinfo

superhackkiller1997
()
Ответ на: комментарий от superhackkiller1997

Если ты обратишься к виртуальной странице, а в пуле «ведра» не будет свободных физических страниц, то оно пойдёт в район ООМкиллера и кильнёт твою 29гиговую байду.

ещё раз, первая копия приложения сделала malloc на 30 гигабайт, ей это предположим разрешили. упорный пользователь записал 29 гигабайт. запускаем вторую копию приложения, она пытается сделать malloc на 30 гигабайт, ей это не разрешат. проверь.

anonymous
()
Ответ на: комментарий от superhackkiller1997

Почему 36бит ты узнаешь из cat /proc/cpuinfo

диапазон адресов памяти 36 бит, фраза:

У тебя памяти в среднем 36бит максимум

означает: у тебя памяти ровно 4.5 байта. слово ровно получается из объединения «в среднем» и «максимум». и дальше остается гадать, что ты под этим понимаешь.

anonymous
()
Ответ на: комментарий от anonymous

Ты чего несёшь, я тебе объясняю, в надежде, что ты попытаешься что-то понять, но ты продолжаешь нести фигню.

Запустил штук 20 одновременных - работает.

int main(void) {
  fprintf(stderr, "%p\n", mmap(NULL, (30ul*1024*1024*1024), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS , 0, 0));
  sleep(100000);
}

superhackkiller1997
()
Ответ на: комментарий от anonymous

В среднем - зависит от камения, кол-ва оперативы, но в среднем на обычных камнях у сметных - это максимум 36бит.

superhackkiller1997
()
Ответ на: комментарий от indie

В конкретной задаче у меня не будет ранда. Поэтому он меняет словия задачи.

В чем смысл бенчмарка, если он работает не так, как код будет работать «в задаче»? Моя задача сделать рандом, но минимизировать влияение этого рандома.

superhackkiller1997
()
Ответ на: комментарий от superhackkiller1997

простите, а где запись в выделенную память?

упорный пользователь записал 29 гигабайт

anonymous
()
Ответ на: комментарий от anonymous

Ну у меня 4гига оперативы - занято почти 3.6 из-за лисы.

Ты несёшь херню, без разницы сколько и где занято памяти это ни на что не влияет.

И да, я тебе скажу, почему у тебя это не работает. В ведре есть кастыль, который доаёт мозможность определять «кол-во памяти» ограничивая ммап. Про это уже писали - это какаха называется оверкоммит.

Если он у тебя врублен - твои проблемы.

superhackkiller1997
()
Ответ на: комментарий от superhackkiller1997

Ты несёшь херню, без разницы сколько и где занято памяти это ни на что не влияет.

влияет, если осталось 400 мегабайт памяти, то 1 гигабайт тебе не дадут выделить malloc-ом или mmap-ом, а 300 дадут. правильно я понимаю?

anonymous
()
Ответ на: комментарий от anonymous

Маллок не выделяет никакую память, тебе это разве не ясно?

А теперь скажи мне, как маллок, который к реальном памяти не имеет отношение что-то там тебе не выделит? Когда я выделяю 300 гигов при 400метрах свободной оперативы.

superhackkiller1997
()
Ответ на: комментарий от superhackkiller1997

Когда я выделяю 300 гигов при 400метрах свободной оперативы.

а ты пробовал? покажи код и строчку компиляции и запуска кода у себя.

Маллок не выделяет никакую память, тебе это разве не ясно?

malloc - memory allocate, слово allocate - в переводе означает выделить, отсюда вызов функции malloc называется иногда выделить память, при этом не имеют ввиду физический захват этого куска памяти.

anonymous
()
Ответ на: комментарий от anonymous

Когда на ваших бубунтах это изменят на вменяемое значение и когда в ведре выпилят этот щитгаритм, который ничем не отличается от 2-ки.

superhackkiller1997
()
Ответ на: комментарий от superhackkiller1997

померял, но это цифра ничего тебе на даст

indie
()
Ответ на: комментарий от superhackkiller1997

Написал на сишке - молодец, понял

Что понял? Представление данных обусловлено условием задачи (скорость выполнения + потребление памяти по возможности). Может добавим в один из элементоа строку с произвольной длиной? Тогда, вероятно, я заюзаю наследование и std::string.

Только ты написал совсем не то, но ладно я тебя прощу.

Что не так? 4 типа элемента - есть, заполнение контейнера - есть, обработка элемента в зависимости от его типа - есть

indie
()
Ответ на: комментарий от indie

Нет, нет. Ты взял свою первую байдень - понял, что она хрень и написал на сишке. Втыкнув туда шаблоны(которые там нахрен не упали).

Потребление памяти у тебя щит, ибо ты заюзал юнион. Т.е. ты банально записываешь блоки по сайзофу самой большой структуры - это делается 2-мя строчками.

В конечном итоге ты получил код, аля породия на мой, который как ты выразился «неуниверсальный и неподдерживаемый» т.е. быдлокод. Ты поделил на ноль, что и требовалось доказать.

superhackkiller1997
()
Ответ на: комментарий от superhackkiller1997

Нет, нет. Ты взял свою первую байдень - понял, что она хрень и написал на сишке.

Пердеж в никуда

Втыкнув туда шаблоны(которые там нахрен не упали).

Можно и без шаблонов, но мне было лень для каждый элемента описывать структуру и функции.

Потребление памяти у тебя щит, ибо ты заюзал юнион.

И что? Небольшой оверхед для более быстрой обработке приемлем.

Т.е. ты банально записываешь блоки по сайзофу самой большой структуры - это делается 2-мя строчками.

Спасибо кэп!

В конечном итоге ты получил код, аля породия на мой, ...

Твоего кода еще никто не видел. Высер выше не в счет, ибо не выполняет условий задачи.

...который как ты выразился «неуниверсальный и неподдерживаемый» т.е. быдлокод.

Пример строк, где есть проблемы? Опять пук в никуда

Ты поделил на ноль, что и требовалось доказать.

Сказать то что хотел?

indie
()
Последнее исправление: indie (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.