是否可以在 C++ 中不使用堆来创建 class 字符串?

Is it possible to create class String without using heap in C++?

我想编写自己的 class 字符串,其界面类似于 std::string。字符串 class 不得使用动态内存分配。

我需要一个 c-tor:

String(char* ptrToFirstCharInTab, char* ptrToLastElementInTab);

并且应该有包含不同(不知道)元素数量的选项卡,所以我在编译时不知道大小。

在我看来这是不可能的,因为如果我们在编译前不知道数组的大小,我们就不能在没有动态分配的情况下创建它——当然创建 500 个字符的缓冲区然后 String class 只能500 这不是我的期望。

你有什么想法吗?也许有什么方法可以让我缩小以适应缓冲区?感谢您的帮助!

你问过:

Do you have any idea? Maybe is any way to create buffor wchich I will shrink to fit?

理论上,可以。您可以使用预分配的缓冲区作为堆内存。但是,您必须编写自己的代码来管理该缓冲区。可行,但我不推荐。

您问的是:

Is it possible to create class String without using heap in C++?

事实上,是的,可以 通过使用 _alloca 或类似的平台相关函数在堆栈上动态分配内存。有关详细信息,请参阅其他答案: C++ How to allocate memory dynamically on stack?

我会反对它,并在开始之前绝对确定这是最好的选择。

更新: 为了演示目的,我使用 gcc:

创建了一个带有内联构造函数的示例

编译器浏览器Link: 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();
   }

我对你的问题有点困惑。您希望 std:: string 没有堆且没有大小限制。很抱歉给你带来这个:你不可能有无限的记忆。

如果您有一个内存池要专用于字符串而不是每个字符串的固定大小,分配器可以这样做。 容器的默认分配器确实是新的,但是您可以替换它而不必复制字符串的内部结构。