gpt4 book ai didi

c++ - C++数组的内存效率

转载 作者:太空宇宙 更新时间:2023-11-04 15:59:04 28 4
gpt4 key购买 nike

在我脑干的某个地方,一个声音在低语:

In C++, an array does not need more memory than the number of elements need.

std::string str = "aabbcc"; 
std::array<std::string, 3> str_array = {"aa", "bb", "cc"};

因此,两者应该具有相同的大小,因为(与 Java 不同),没有单独的 size 字段或类似字段。但是我没有找到引用。

这是真的吗?什么情况下不是?

最佳答案

用任何语言存储字符串都比您想象的要复杂。 C++ std::string 必须为内容提供连续存储。除此之外,std::string 可以容纳更多内容,例如指向最后一个字符的指针/迭代器、其中的字符数等。std::string::size 要求为 O(1),因此它必须存储比缓冲区更多的信息。此外,大多数标准库实现都提供 SSO(小字符串优化)。启用 SSO 时,std::string 分配一个小缓冲区,以避免不必要的动态分配。您还可以保留比您需要的更多的内存。比方说,您需要循环收集 800-1000 个字符。你可以这样做:

std::string str;
for(...)
str += some_character;

但这会导致不必要的内存分配和释放。如果您可以估计要存储的字符数,则应该 reserve内存。

std::string str;
str.reserve(1000);
for(...)
str.push_back(some_character);

然后,您可以随时shrink_to_fit , 以节省内存:

str.shrink_to_fit();

还有一些你必须要注意的事情:

  • reserve 增加容量,但 size 保持不变。这意味着,std::string 还必须存储(或能够计算)缓冲区容量允许的字符数。
  • 字符串字面量以 null 结尾
  • std::basic_string::c_str 必须返回空终止字符数组,因此 std::string 也可能包含空终止符(不幸的是我不是确定它是如何完成的)
  • 有更多的编码和字符集——ASCII 只是其中之一。 UTF-8 和 UTF-16 编码的字符串可能需要使用很少的存储元素来添加到一个代码点,但这更复杂。

关于c++ - C++数组的内存效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49018911/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com