LINUX.ORG.RU

[Адептам C++] Класс строки, с хранением данных только на стеке


0

1

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

★★

calloc позволяет выделать данные на стеке. Но при этом есть некоторые ограничения. Дело в том, что фактически, отдать память на стеке можно и обязательно только после освобождения всех нижесозданных увелечений стека и перед удалением любых вышесозданных.

Но создать объект, которые при конструировании будет занимать определенное место на стеке можно. Особенно легко это сделать, если у тебя статически известен размер этого объекта (передать как параметр шаблона)

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

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

размер известен только на этапе создания объекта в рантайме.

k0l0b0k ★★
() автор топика

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

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

или напиши код на последнем стандарте С. Там размерность массива можно задавать динамически. Но это верно только для С, а не для С++

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

я туда же. но в принципе, все поняли :)

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

ой. точно. во туплю

вперед и с песней: изращаться с макросами, предвыделение памяти, вызов конруткора на уже выделной памяти и тд

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

Можешь описать подробнее задачу

На стадии компиляции известно, сколько памяти понадобится? Ну или в момент вызова функции? (я имею в виду статически)

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

неа.

есть 2КБ RAM, хочу сделать удобную работу со строками (надо много парсить разного бреда), без предвыделения памяти. возможно бред конечно, но тем не менее.

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

> см. выше :)

То есть, Qt такую задачу не решили? ну, тогда, полагаю, тебе тоже придётся туго, так бы подсмотрел у них.

name_no ★★
()

ну ладно, буду извращаться по-другому.

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

что-то оно не очень гуглится. он не пользует malloc в работе?

k0l0b0k ★★
() автор топика
Ответ на: комментарий от name_no

> как в Qt решили эту проблему?

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

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

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

>без предвыделения памяти
я бы так не делал.
когда я делал сеть на avr-ках, памяти тоже надо было много, но было в обрез, в т.ч. и для стека. приходилось делать всякие счетчики циклов и прочий локальный стаф глобальными переменными и следить, чтобы они не использовались одновременно в разных функциях.
и чуть ли не в union некоторые объединять... в общем было весело :)
(я отлично понимал тогда, что так делать нельзя)

в твоём случае максимум - задействовать c99 с его variable length array.
либо шаблоны по значению переменной, типа такого:
template <int N> class str {
char s[N];
};

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

чтобы эффективней тратить память под временные данные, а не кучу статических буферов типа char[256], char[64] и т.п.

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

Ты упомянул парсинг. Может тебе на самом деле надо конечный автомат сделать, а не искать как бы растолкать данные по буферам?

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

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

k0l0b0k ★★
() автор топика

А разве нельзя сваять свой собственный стек специально для строк. Нужен кусок непрерывной памяти (возможно растущий с помощью mmap()) и нужен указатель на вершину стека. Всё. Храним в стеке ровно столько байт строки, сколько надо.

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