如果我使用
const char * str = "Hello";
运行时
中不需要内存分配/解除分配如果我使用
const std::string str = "Hello";
是否会在字符串类中通过new / malloc进行分配?我可以在集会中找到它,但我不擅长阅读它。
如果答案是"是的,会有malloc / new",为什么?为什么只能在std :: string里面传入内部const char指针并在需要编辑编辑字符串时进行实际的内存分配?
答案 0 :(得分:5)
是否会在string类中通过new / malloc进行分配?
这取决于。 string
对象必须提供一些内存来存储数据,因为这是它的工作。一些实现使用“小字符串优化”,其中对象包含一个小缓冲区,并且只有在字符串太大的情况下才从堆中分配。
为什么只能在
std::string
内传递到内部const char指针并在需要编辑编辑字符串时进行实际的内存分配?
您描述的内容不一定是优化(因为每当您修改字符串时都需要额外的运行时检查),并且在任何情况下迭代器失效规则都不允许这样做。
有一个string_view
的提案,允许您使用const string
之类的接口访问现有字符序列,而无需任何内存管理。它还不是标准的,也不允许你修改字符串。
答案 1 :(得分:1)
std::string
的天真实现将需要堆分配,但是如果在运行时未修改初始化字符串,则允许编译器通过用替代实现的对象替换它们来优化静态初始化的std::string
对象。 p>
在实例化不可变字符串时可以使用const std::string
以确保更好的优化。
答案 2 :(得分:0)
C ++标准实际上并没有说你不能只存储指向外部字符串(和长度)的指针。但是,这意味着每次修改字符串(例如char& std::string::operator[](size_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
的价值是多少?
有很多这样的情况,如果你只是复制原始字符串,会导致更多问题,很少或没有任何好处。