LINUX.ORG.RU

Сломал мозг

 


0

4

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

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

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

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

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

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

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

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

Киллер, а че ты пишешь-то вообще? Расскажи, я тоже буду писать. А то каникулах делать нефиг.

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

Маллок после определённого значения тупо начинает юзать ммап, дак вот ммап отвалится не может.

Он может отвалится с номем по нескольким причинам - моё значени не адекватно, а оно уменя всегда адекватно. Я напоролся на лиммиты по паппингу. Если я буду буду одновременно ммапить тысячи раз - я это учту.

Адресы, которые даёт ммап никак не связаны с оперативной памятью и следить по нулу за окончанием оперативы не можешь. Слить 48бит адресов ты тоже не можешь.

Если ты хочешь жрать память и не быть убитым оомкиллером - тебе надо один фиг писать обёртку над ммапом, но это не нужно, ибо проще быть убитым ООМкиллером.

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

Такое поведение маллок одинаково верно для всех версий линукс и для всех поддеживаемых линукс архитектур?

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

Ты не осилил принтф, но осмелился обвинять меня? В этом ваша бида.

Я то осилил printf, а вот ты - нет.

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

Если его нет - я рад. Если кто-то поставил двойку - его проблемы и клал на него, ибо нехрен менять то, о чем ты не шаришь.

И да, мне проще чекнуть систему на наличие плодов анскильных ущербанов, чем юзать какие-то ненужны хрепоймичего проверки.

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

Маллок после определённого значения тупо начинает юзать ммап

Который маллок? А то их много. В каждой системе - свой велосипед. У них только интерфейс общий, который в манах описан (но ты их не читал, да).

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

Ну а теперь, гореосилятор мой, объясни мне как свазана строка форматирования и аргументы?

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

Строка форматирования отвечает за форматирования, если я напишу %u на uint64_t значения которого больше 32бит - оно просто не нарисует циферки из битов выше 32-го.

Без разницы в какой системе, но строка форматирования никак не влияет на аргументы, так же как аргументы не влияют на форматирование.

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

Аргументы передаются по значению. Вы очень сильно ошибаетесь. В С++ эту проблему решает boost:format.

#include <stdio.h>
#include <stdint.h>

int main()
{
	uint64_t a = 256;
	uint32_t b = 512;
	printf("%i %i\n", a, b);
	return 0;
}
numas@gnunix ~ $ gcc -Wno-format app.c
numas@gnunix ~ $ ./a.out 
256 0
numas@gnunix ~ $
numas13 ★
()
Ответ на: комментарий от superhackkiller1997

Ну а теперь, гореосилятор мой, объясни мне как свазана строка форматирования и аргументы?

По строке форматирования printf читает аргументы со стека. У него нет никакой другой информации о типах, кроме как предоставленной в строке форматирования.

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

Правильно работать оно скорее всего не будет. В особо тяжёлых случаях оно будет даже сегфолтиться.

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

Так размер параметров-то разный будет. А переход к следующему параметру рассчитывается по размеру текущего.

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

man amd64 abi, и да я клал на то, что происходит в твоём ущербном 32битном х86.

Если я что-то буду писать то, что должно работать где-то ещё - я погляжу как там работает принтф, да и я принфюзаю его максимум для дебага, ибо он ущербен.

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

Я не плюнул в лицо спо - я плюнул на одну из его ущербность.

некоторые спошники, ведомые «законами» юникса и сишки поверили, что можно делать всё и для всего и теперь их код состоит на 90% из кастылей для мёртвых архитектур.

Это порочно, ибо рано или поздно они будут погребены под своими кастылями. Я не считаю это вменяемым.

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

Обрубите дереву корни, и посмотрите что будет дальше.

Хотя я не об этом. В первую очередь, программы должны быть стабильными. Основываясь на этой стабильности, они и становятся большими.

Эгоизм проходит, я надеюсь.

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

Я не пишу такого кода, в котором они даже не влезают в регистры.

Да ты вообще кроме hello world'ов ничего не пишешь.

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

Т.е. вы продолжите кормить трупы, будите с ними говорить и т.п.?

Архитектура умерла - её поддержка выпиливается из кода и живёт отдельно в своей ветке.

Программы должны быть простыми, вменяемыми и хорошими. А кастыль на каждом углу даст тебе лишь пустую трату времени.

Становятся большими они из-за человекачасов, да и большие - это порочно. Чем больше, тем ущербней, чем универсальней, тем ущербней.

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

Я думаю о ком-то, когда это ЕМУ НУЖНО, а о когда это ЕГО БЛАЖЬ - это меня не интересует.

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

Я надеюсь, ты это сейчас netcat'ом запостил?

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

Идём в гугл, смотришь сколько регистров у х86.

Вменяемый гцц, вменяемый притф юзает регистры даже на 7 аргументов, а стек юзает с 8байтным выравниванием. И правильно делает, если на твоей архитектуре это не так - это твои проблемы, если стек не выравнивается по размеру регестра - выкинь свой конпелятор.

Мой код никогда, даже на твоём тухлом 32битном х86 не умрёт, ибо я юзаю типы для 32 и 64битных типов.

Поэтому ты очередной балабол, который сказал фигню и рад.

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

А и да, давай я тебе тоже объясню, почему ты не прав.

Ты заюзал 64битную переменную на ущербном 32битном х86, что дало тебе фейл. Я же юзаю типы для 32 и 64битных значений.

Юзать их для значений меньше 32бит смысла нет, даже на твоей плохой архитектуре.

Поэтому это не мой эгоизм, а твоё неосиляторство, не более.

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

Я не отбираю у вас игрушку. Хочу что бы вы взглянули на мир более глобально.

Вы пишете не в машинных командах, не на ассемблере, а на Си. Это очень далеко отдаляет вас от архитектуры. Компилятор решает как ваш код будет исполнятся на ЭВМ. Не нравиться, спускайтесь ниже.

Универсальный код будет просто работать. Будет приносить пользу.

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

Не читал, но осуждаю? =))))

Ты хоть бы аргументы привел, почему мой код работать не будет, иначе это просто пердеж в никуда

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

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

что будет если функция create_id0 и create_id1 вызывается произвольное число раз, заранее не определенное? скажем ввод данных от пользователя?

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

Как хорошо что вы это заметили. В универсальном коде, этой проблемы бы не наблюдалось. Это ваша ошибка.

А теперь подумайте что может ждать ваш код в будущем? Я надеюсь на ваше прозрение.

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

Смотри - ты хранишь массив класов, а каждый класс хранит метаифу - это таблица методов и прочая байда. Это байт 8. Ты юзаешь массив указателей, чтобы хранить свои классы - это ещё 8байт.

Уже 16байт на елемент. Плю там ещё всякая мелачёвка, плюс насилование кешей тоннами стл-выхлопа. Да на х86 с его метрами и десятками килобайт л1 это не мало заметно - на какй-нибудь слабой архитектуре это у тебяб удет тормазить дай дороги из-за кешмисов 24/7.

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

Плюс, аллокатор, какт ы будешь «выделять» память под свои классы? new/malloc на каждый класс? Это ещё 16-32байта оверхеда на елемент.

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

И в конечном итоге ты поймёшь, что я имел ввиду.

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

Нет, это проблемы нет и у меня, а у тебя есть лишная работа.

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

Мой код будет работать, если понадобится другой код - будет написан другой код. Мне не жалко понтартить 30секунд, чтобы переписать эту портянку.

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

С++ код мало того, что состоит из больших строк, тормазит и даёт дохренуа оверхеда - он тащит за сабой стл - т.е. на самом деле он ещё больше - там строк 700 в конечном итоге будет.

Дак вот, отгадай что лучше?

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

Насрать на твой amd64. Есть стандарт языка и если ты ему не следуешь без уважительной причины - ты быдлокодер.

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

Профи. Давай тесты что ли устроим. Я возьму С++, а ты что хочешь. Покажешь мне на каком-нибудь хорошем примере тормоза плюсов?

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

я вас правильно понял? на вопрос:

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

что будет если функция create_id0 и create_id1 вызывается произвольное число раз, заранее не определенное? скажем ввод данных от пользователя?

ответ:

Это будет маллок на 36бит.

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

условия только в начале с ним очень точно обговори, условия правильности решения. а то бесполезно.

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

Спасибо кэп. Ну будет небольшой оверхед и что?
Программа медленнее станет? Да не факт.

В любом случае ты не знаешь как правильно использовать цпп.

И ты тут про амд64 пердел, а тут про медленные архитетуры заговорил. Ты уж определись под что ты пишешь и на сколько твои оптимизации ускорят реальное приложение.

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

Я ему следую с уважительной причной - я знаю лучше стандарта что и как юзать.

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

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

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

В таком случае у тебя будет куча #ifdef-ов с абсолютно разным кодом. Поддерживать такое та еще задача. А это говнокод.

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

Соглашайся уже, что твой код гавно и закончим на этом =).

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

Небольшой? 32-50байт на 16байт данных - нибольшой оверхед.

А если у тебя данных 50метров, а оперативки 100метров? ЧТо ты будешь делать? Так же ныть про «небольшой оверхед»?

Да, станет медленней.

Ты веришь в то, что амд64 медленней 32битного х86? Я на винфакечтоле?

Давай так - напиши мне код, который может записывать тысячи елементов - т.е. с алокатором и т.п.

Я напишу свой - поглядим на оверхед.

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

Ну давай у нас есть 2-4типа данных. У них есть аккумулятор и пару перменных + функция - функция должна складывать значения все переменных, кроме аккумулятора и класть их в аккумулятор.

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

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

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

Давай так - напиши мне код, который может записывать тысячи елементов - т.е. с алокатором и т.п.

по конкретней пожалуйста. тысячи каких элементов? сколько тысяч? записывать откуда? записывать куда? записывать и все?

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

Я не очень тебя понял. Можно кодом?

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

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

вопрос: что будет если функция create_id0 вызывается неизвестное на этапе компиляции число раз?

код примерно такой:

while(!flag_end)
{
  pull = create_id0(pull, 100123, 100223, 100323);
  // некоторый код изменяющий по ответу пользователя flag_end
}

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

Есть 4 типа елментов, которые хранят 3, 4, 5, 6 переменных + на каждый тип функцию-конструктор и функцию-метод.

Конструктор берёт 2 - 5 значений и записывает их в твой класс. Функция методом складывает все значения и помещает их в переменную acc, которая есть в каждом типе.

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

Потом для каждого елемента вызваешь его метод.

Потом удаляешь хранилище.

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

У тебя памяти в среднем 36бит максимум. Это 30+гигов. Ты юзаешь маллок на 30+гигов и у тебя адреса кончатся до того момента, когда у тебя кончится память.

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

superhackkiller1997
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.