Можно ли создать класс String без использования кучи в C ++? - PullRequest
0 голосов
/ 21 ноября 2018

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

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

String(char* ptrToFirstCharInTab, char* ptrToLastElementInTab);

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

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

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

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

Вы спросили:

Возможно ли создать класс 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 here



int main() {
    return workWithString();
   }
0 голосов
/ 21 ноября 2018

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

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

0 голосов
/ 21 ноября 2018

Вы спросили:

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

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

...