是否可以在 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
没有堆且没有大小限制。很抱歉给你带来这个:你不可能有无限的记忆。
如果您有一个内存池要专用于字符串而不是每个字符串的固定大小,分配器可以这样做。
容器的默认分配器确实是新的,但是您可以替换它而不必复制字符串的内部结构。
我想编写自己的 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
没有堆且没有大小限制。很抱歉给你带来这个:你不可能有无限的记忆。
如果您有一个内存池要专用于字符串而不是每个字符串的固定大小,分配器可以这样做。 容器的默认分配器确实是新的,但是您可以替换它而不必复制字符串的内部结构。