C++ std::string和const char*

C++ std::string和const char*,c++,string,memory-management,C++,String,Memory Management,如果我使用 const char * str = "Hello"; 运行时不需要内存分配/释放 如果我使用 const std::string str = "Hello"; 是否会在字符串类中通过new/malloc进行分配?我可以在汇编中找到它,但我不擅长阅读 如果答案是“是的,将有malloc/new”,为什么?如果我需要编辑编辑字符串,为什么std::string中只能传递到内部const char指针并进行实际内存分配?std::string的原始实现将需要堆分配,但是编译器可以通过

如果我使用

const char * str = "Hello";
运行时不需要内存分配/释放

如果我使用

const std::string str = "Hello";
是否会在字符串类中通过new/malloc进行分配?我可以在汇编中找到它,但我不擅长阅读


如果答案是“是的,将有malloc/new”,为什么?如果我需要编辑编辑字符串,为什么std::string中只能传递到内部const char指针并进行实际内存分配?

std::string的原始实现将需要堆分配,但是编译器可以通过替换静态初始化的
std::string
对象来优化它们如果在运行时未修改初始化字符串,则使用替代实现的对象

实例化不可变字符串时,可以使用
const std::string
,以确保更好的优化

是否会在字符串类中通过new/malloc进行分配

视情况而定。
字符串
对象必须提供一些内存来存储数据,因为这是它的工作。一些实现使用“小字符串优化”,其中对象包含一个小缓冲区,并且只有当字符串太大而无法从堆中进行分配时,才会从堆中进行分配

如果我需要编辑字符串,为什么在
std::string
中只能传递到内部const char指针并进行实际内存分配

您所描述的不一定是优化(因为在您修改字符串时需要额外的运行时检查),而且在任何情况下,迭代器无效规则都不允许这样做


有一个关于的建议,允许您使用像
const string
这样的接口访问现有字符序列,而无需任何内存管理。这还不是标准的,不允许你修改字符串。

< P> C++标准实际上并不是说你不能只存储一个指向外部字符串的指针(和长度)。但是,这意味着每次修改字符串时(例如,
char&std::string::operator[](size\u t index)
)都必须确保字符串实际上是可写的。因为大量的字符串使用不只是使用常量字符串来存储字符串,而是确实修改了字符串[或者使用一个不是常量输入的字符串]

因此,一些问题是

std::string s = "Hello";
char &c = s[1]; 
c = 'a';    // Should make string to "Hallo". 
如果:

char buffer[1000];
cin.getline(buffer);   // Reads "Hello"
std::string s = buffer;
cin.getline(buffer);   // Reads "World"
现在
s
中的值是多少


有很多这样的情况,如果您只是复制原始字符串,将导致更多的问题,几乎没有或根本没有好处。

这不取决于您的实现吗?请注意,这两个代码示例并不等效,因为第二个示例允许修改字符串。想想这些词的含义:
charstr[]=“Hello”
常量std::string str=“Hello”
甚至
static const std::string str=“Hello”
@NeilKirk你是对的,我已经编辑了answerDefine“最大优化”。在函数中,静态cosnt std::string
会更“优化”,因为每次函数调用的动态分配可能更少。你说得对。我的方法是支持堆栈,而不是整个内存空间。您假设字符串数据将在堆栈上。string_视图看起来很有趣,因为我大部分时间都是常量字符串填充一次,几乎从未修改过(因为几乎,常量字符*对我来说不是最好的解决方案),因为我的字符串在90%的情况下是只读的(我使用它们作为散列键),额外的检查对我来说是可以的。对于第二个示例…不是const char*,所以我希望会有对std::string的复制,并且缓冲区没有封装在字符串中。当然,您可以编写自己的类“const_string”或者类似的,不允许修改,并且使用指针。考虑到这样一个字符串只允许几个操作,我想写它不会花那么长时间。