Pokimon
> А что дальше писать?
Компилятор же.
Pokimon
на него смотреть страшно, не то что использовать...
твой стек даже пустым будет занимать sizeof(data_pool) + sizeof(bStackType) * defsize байт памяти? что намного больше чем std::stack на векторе...
Pushkoff
> твой стек даже пустым будет занимать sizeof(data_pool) + sizeof(bStackType) *
> defsize байт памяти? что намного больше чем std::stack на векторе...
Какая беда. Пустой стек весит целый килобайт(в случае std::string)
du_hast
> Компилятор же.
Интерпретатор.
Хотел сначала написать интерпретатор простых арифметический выражений, но с переменными.
Смотрел на эту тему в книге Страуструпа, но он как обычно создал что-то вырвиглазное.
Почитав немного умных книжек я понял, что для каждого выражения мне нужно построить дерево, а затем просто пройти его снизу вверх.
Остается 2 вопроса
1) Алгоритм обхода дерева снизу вверх? решаемый собственными силами.
2) Где хранить переменные? стек для этого явно не годится.
gexogen
> правда думаешь парочка арифметических операций так влияют?
я где-то писал что в этих операциях заключено всё зло? :D
они просто лишние... да и на самом деле там не парочка
Pokimon
> new(pool->cur++) bStackType(item);
Э-ээ, зачем текущую позицию хранить в pool?
doc.
> > new(pool->cur++) bStackType(item);
> Э-ээ, зачем текущую позицию хранить в pool?
Хороший вопрос.
Подумав, я пришел к выводу, что ее можно хранить и отдельно.
Но выбранный мною способ
1) Вроде не мешает производительности?
2) структура data_pool равна 16 байтам.
Pokimon
> Почитав немного умных книжек я понял, что для каждого выражения мне нужно
> построить дерево, а затем просто пройти его снизу вверх.
Глупые книжки читал. Для арифметических выражений без этого спокойно обходится.
Pokimon
> Какая беда. Пустой стек весит целый килобайт(в случае std::string)
ты заявлял что он расходует меньше памяти... а на самом деле больше...
Pokimon
> Но выбранный мною способ
Никаких приемуществ не дает, зато:
1. приводит к хранению ненужной информации
2. приводит к хранению необходимой инфы "где-то там"
3. приводит к аллокации памяти для пустого стека
Pushkoff
> ты заявлял что он расходует меньше памяти... а на самом деле больше...
Ммм.. Думаете std::stack высвобождает память при многократном Pop??
А вот мой высвобождает!
doc.
> 1. приводит к хранению ненужной информации
Ахах учите программирование сэр.
Я же вам написал, что с ним структура data_pool весит 16 байт.
А без него? тоже 16 байт.
Вот только теперь 4 байта уж совсем ушли в пустоту.
> 2. приводит к хранению необходимой инфы "где-то там"
Поэтому страуструп и критикует глобальные переменные. (они хранят где-то там)
> 3. приводит к аллокации памяти для пустого стека
Смотрите внимательно код.
Для пустого стека создается статический массив и никакой аллокации нет.
Более того. 90% стеков не нужно хранить больше 32 элементов и в этом случае мой стек обходится вообще без аллокации.
Pokimon
> Почитав немного умных книжек я понял, что для каждого выражения мне нужно построить дерево, а затем просто пройти его снизу вверх.
Необязательно. Пример разбора выражение с использованием двух стеков - операндов и операторов:
X = A + B*C - D;
S1{ X }
S2{}
S1{ X }
S2{ = }
S1{ X A }
S2{ = }
S1{ X A }
S2{ = + } '+' > '=' // приоритет оператора + больше чем оператора '='
S1{ X A B}
S2{ = + }
S1{ X A B}
S2{ = + * } '*' > '='
S1{ X A B C}
S2{ = + * }
S1{ X A B C}
S2{ = + * } '*' > '-'
S1{ X A {B*C}}
S2{ = + } '+' == '-'
S1{ X {A+B*C}}
S2{ = - } '-' > '='
S1{ X {A+B*C} D}
S2{ = - }
// строка закончилась - делаем выборку из стеков пока не будут пустыми
S1{ X {A + B*C - D}}
S2{ = }
S1{}
S2{}
X = A + B*C - D
Pokimon
> Ахах учите программирование сэр.
> Я же вам написал, что с ним структура data_pool весит 16 байт.
Вот-вот изучайте. Если делать через одно место то не только 16 получится. :)
>Поэтому страуструп и критикует глобальные переменные.
где тут глобальные? :)
>Для пустого стека создается статический массив и никакой аллокации нет.
Лишний повод его не использовать.
>Более того. 90% стеков не нужно хранить больше 32 элементов и в этом случае мой стек обходится вообще без аллокации.
Для специального случая сделать специальный стек который специально будет хранить все на стеке. Почему кстати 32? А если я хочу 8 или 100?
doc.
> Почему кстати 32? А если я хочу 8 или 100?
легко настраивается через шаблон.
bStack<int, 8> hello;
doc.
> где тут глобальные?
Потому, что они не локальные. Вы не понимаете философии Страупского программирования.
Если кратко - "чем локальнее, тем лучше"
Вот в моем случае pool->cur содержит инфу только об этом пуле, следовательно должен находится в нем, но никак не вне его.
doc.
> Вот-вот изучайте. Если делать через одно место то не только 16 получится.
Вероятно вы в школе не проходили, что компилятор добавляет мусор в структуры для выравнивания?
Интересно? Невероятно?
Поэкспериментируйте с sizeof()
doc.
> Лишний повод его не использовать.
Думаете STL сразу все признали годной и начали использовать?
Подождите. Прийдет время и в коде со всех континентов будут сверкать строчки с bStack
doc.
> Необязательно. Пример разбора выражение с использованием двух стеков -
> операндов и операторов:
Спс. Но я уже прочитал про обратную польскую запись и буду ее использовать.
Заодно и стек пригодится.
Pokimon
> Ммм.. Думаете std::stack высвобождает память при многократном Pop??
можно заставить его это сделать при помощи операции присвоения и последующего swap... причем я могу сделать это в момент когда мне это нужно, твой же стек будет постоянно страдать ерундой, освобождая и выделяя память снова и снова...
Pushkoff
> можно заставить его это сделать при помощи операции присвоения и последующего
> swap... причем я могу сделать это в момент когда мне это нужно, твой же стек
> будет постоянно страдать ерундой, освобождая и выделяя память снова и снова...
Мой стек не будет страдать ерундой. Он оставляет 1 пустой пулл для таких случаев.
Про первую часть вашего предложения: и это называется ООП и обобщенное программирование? Вы возвращаетесь к куличикам Си.
Pokimon
> Потому, что они не локальные. Вы не понимаете философии Страупского программирования.
Да что вы говорите... :D Короче, из разряда слышал звон...
> что компилятор добавляет мусор в структуры для выравнивания?
тебе видать забыли сообщить, что эта вещь регулируется.
Pokimon
> Мой стек не будет страдать ерундой. Он оставляет 1 пустой пулл для таких случаев.
количество элементов в стеке в среднем варьируется от 33 до 100, что будет происходить как часто будут выделяться и освобождаться новые буферы??
> Про первую часть вашего предложения: и это называется ООП и обобщенное
> программирование? Вы возвращаетесь к куличикам Си.
это можно обернуть в класс, но оно и не обернутое не напрягает...
и у меня вопрос: почему data_pool не является отдельным классом?
и зачем data_pool держать в себе текущий элемент?
Тема в архиве.