Можно ли создать класс String без использования кучи в C ++?

Я хотел бы написать мне собственный класс String, который будет иметь интерфейс, похожий на std :: string. Класс String не должен использовать динамическое выделение памяти.

Мне нужно иметь c-tor:

String(char* ptrToFirstCharInTab, char* ptrToLastElementInTab);

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

По моему мнению, это невозможно, потому что, если мы не знаем размер нашего массива до компиляции, мы не сможем создать его без динамического выделения — конечно, создавая буфер на 500 символов, а затем класс String может быть только 500, это не мои ожидания.

Есть ли у вас какие-либо идеи? Может быть, есть какой-нибудь способ создания буфора, который я уменьшу, чтобы соответствовать? Спасибо за помощь!

0

Решение

Вы спрашивали:

Есть ли у вас какие-либо идеи? Может быть, есть какой-нибудь способ создания буфора, который я уменьшу, чтобы соответствовать?

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

4

Другие решения

Я немного запутался с вашим вопросом. Вы хотите иметь std:: string без кучи и без ограничений по размеру. Извините, что принес это вам: у вас не может быть бесконечной памяти.

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

1

Вы спрашивали:

Можно ли создать класс String без использования кучи в C ++?

На самом деле, да, это возможно динамически распределять память в стеке используя _alloca или подобная зависимая от платформы функция. Смотрите этот другой ответ для более подробной информации:
C ++ Как динамически распределять память по стеку?

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

Обновить:
Я создал пример с встроенным конструктором для демонстрационных целей, используя gcc:

Проводник компилятора Ссылка:
https://godbolt.org/z/M1F5VD

Полный код:

#include <alloca.h>

struct String {
__attribute__((always_inline)) inline String(size_t size) {
bytes= static_cast<char*>(alloca( size ));// alloca() memory gets allocated here
}
char* bytes;
};

int workWithString( )
{
//std::string teststr("test");
String mystrclass(1000);
mystrclass.bytes[0] = 'a';
mystrclass.bytes[1] = 0;
return 0;
}  // alloca() memory only gets freed hereint main() {
return workWithString();
}
1
По вопросам рекламы [email protected]