ФлеймФорумПрограммирование

Создан стек (10 стр)

Страницы: 17 8 9 10 11 12 Следующая »
#135
17:51, 8 апр 2010

Pokimon
> А что дальше писать?

Компилятор же.

#136
18:01, 8 апр 2010

Pokimon
на него смотреть страшно, не то что использовать...
твой стек даже пустым будет занимать sizeof(data_pool) + sizeof(bStackType) * defsize байт памяти? что намного больше чем std::stack на векторе...

#137
18:18, 8 апр 2010

Pushkoff
> твой стек даже пустым будет занимать sizeof(data_pool) + sizeof(bStackType) *
> defsize байт памяти? что намного больше чем std::stack на векторе...
Какая беда. Пустой стек весит целый килобайт(в случае std::string)

du_hast
> Компилятор же.
Интерпретатор.
Хотел сначала написать интерпретатор простых арифметический выражений, но с переменными.
Смотрел на эту тему в книге Страуструпа, но он как обычно создал что-то вырвиглазное.

Почитав немного умных книжек я понял, что для каждого выражения мне нужно построить дерево, а затем просто пройти его снизу вверх.
Остается 2 вопроса
1) Алгоритм обхода дерева снизу вверх? решаемый собственными силами.
2) Где хранить переменные? стек для этого явно не годится.

#138
18:21, 8 апр 2010

gexogen
> правда думаешь парочка арифметических операций так влияют?
я где-то писал что в этих операциях заключено всё зло? :D
они просто лишние...  да и на самом деле там не парочка


Pokimon
> new(pool->cur++) bStackType(item);
Э-ээ, зачем текущую позицию хранить в pool?

#139
18:28, 8 апр 2010

doc.
> > new(pool->cur++) bStackType(item);
> Э-ээ, зачем текущую позицию хранить в pool?
Хороший вопрос.
Подумав, я пришел к выводу, что ее  можно хранить и отдельно.
Но выбранный мною способ
1) Вроде не мешает производительности?
2) структура data_pool равна 16 байтам.

#140
18:30, 8 апр 2010

Pokimon
> Почитав немного умных книжек я понял, что для каждого выражения мне нужно
> построить дерево, а затем просто пройти его снизу вверх.
Глупые книжки читал. Для арифметических выражений без этого спокойно обходится.

#141
19:04, 8 апр 2010

Pokimon
> Какая беда. Пустой стек весит целый килобайт(в случае std::string)
ты заявлял что он расходует меньше памяти... а на самом деле больше...

#142
19:23, 8 апр 2010

Pokimon
> Но выбранный мною способ
Никаких приемуществ не дает, зато:
1. приводит к хранению ненужной информации
2. приводит к хранению необходимой инфы "где-то там"
3. приводит к аллокации памяти для пустого стека

#143
19:35, 8 апр 2010

Pushkoff
> ты заявлял что он расходует меньше памяти... а на самом деле больше...
Ммм.. Думаете std::stack высвобождает память при многократном Pop??
А вот мой высвобождает!

doc.
> 1. приводит к хранению ненужной информации
Ахах учите программирование сэр.
Я же вам написал, что с ним структура data_pool весит 16 байт.
А без него? тоже 16 байт.
Вот только теперь 4 байта уж совсем ушли в пустоту.
> 2. приводит к хранению необходимой инфы "где-то там"
Поэтому страуструп и критикует глобальные переменные. (они хранят где-то там)
> 3. приводит к аллокации памяти для пустого стека
Смотрите внимательно код.
Для пустого стека создается статический массив и никакой аллокации нет.
Более того. 90% стеков не нужно хранить больше 32 элементов и в этом случае мой стек обходится вообще без аллокации.

#144
19:39, 8 апр 2010

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?

#145
20:00, 8 апр 2010

doc.
> Почему кстати 32? А если я хочу 8 или 100?
легко настраивается через шаблон.
bStack<int, 8> hello;

doc.
> где тут глобальные?
Потому, что они не локальные. Вы не понимаете философии Страупского программирования.
Если кратко - "чем локальнее, тем лучше"
Вот в моем случае pool->cur содержит инфу только об этом пуле, следовательно должен находится в нем, но никак не вне его.

doc.
> Вот-вот изучайте. Если делать через одно место то не только 16 получится.
Вероятно вы в школе не проходили, что компилятор добавляет мусор в структуры для выравнивания?
Интересно? Невероятно?
Поэкспериментируйте с sizeof()

doc.
> Лишний повод его не использовать.
Думаете STL сразу все признали годной и начали использовать?
Подождите. Прийдет время и в коде со всех континентов будут сверкать строчки с bStack


doc.
> Необязательно. Пример разбора выражение с использованием двух стеков -
> операндов и операторов:
Спс. Но я уже прочитал про обратную польскую запись и буду ее использовать.
Заодно и стек пригодится.

#146
20:03, 8 апр 2010

Pokimon
> Ммм.. Думаете std::stack высвобождает память при многократном Pop??
можно заставить его это сделать при помощи операции присвоения и последующего swap... причем я могу сделать это в момент когда мне это нужно, твой же стек будет постоянно страдать ерундой, освобождая и выделяя память снова и снова...

#147
20:16, 8 апр 2010

Pushkoff
> можно заставить его это сделать при помощи операции присвоения и последующего
> swap... причем я могу сделать это в момент когда мне это нужно, твой же стек
> будет постоянно страдать ерундой, освобождая и выделяя память снова и снова...
Мой стек не будет страдать ерундой. Он оставляет 1 пустой пулл для таких случаев.
Про первую часть вашего предложения: и это называется ООП и обобщенное программирование?  Вы возвращаетесь к куличикам Си.

#148
20:45, 8 апр 2010

Pokimon
> Потому, что они не локальные. Вы не понимаете философии Страупского программирования.
Да что вы говорите... :D  Короче, из разряда слышал звон...

> что компилятор добавляет мусор в структуры для выравнивания?
тебе видать забыли сообщить, что эта вещь регулируется.

#149
21:45, 8 апр 2010

Pokimon
> Мой стек не будет страдать ерундой. Он оставляет 1 пустой пулл для таких случаев.
количество элементов в стеке в среднем варьируется от 33 до 100, что будет происходить как часто будут выделяться и освобождаться новые буферы??

> Про первую часть вашего предложения: и это называется ООП и обобщенное
> программирование?  Вы возвращаетесь к куличикам Си.
это можно обернуть в класс, но оно и не обернутое не напрягает...

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

Страницы: 17 8 9 10 11 12 Следующая »
ФлеймФорумПрограммирование

Тема в архиве.