0

我想编写自己的类 String,它的接口类似于 std::string。字符串类不应使用动态内存分配。

我需要一个 c-tor:

String(char* ptrToFirstCharInTab, char* ptrToLastElementInTab);

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

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

你有什么主意吗?也许有什么方法可以创建我会缩小以适应的缓冲区吗?感谢帮助!

4

3 回答 3

4

您问:

你有什么主意吗?也许有什么方法可以创建我会缩小以适应的缓冲区吗?

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

于 2018-11-21T18:44:18.577 回答
2

您问:

是否可以在不使用 C++ 中的堆的情况下创建类 String?

事实上,是的,可以通过使用或类似的平台相关函数在堆栈上动态分配内存。_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();
   }
于 2018-11-21T18:56:40.587 回答
1

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

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

于 2018-11-21T20:26:47.793 回答