在 C++ 中字符串的大小与字符数组的大小

Size of string vs size of char array in c++

本文关键字:字符 数组 C++ 字符串      更新时间:2023-10-16

我必须编写一段代码并将其部署在内存空间有限的系统中,并且正在考虑char数组与字符串。我写了以下一段代码以获得更好的想法。

string str="abcde";
char carray[6]={'a','b','c','d','e',''};
cout <<"size of char array:"<< sizeof(carray) << endl ;
cout <<"size of string:"<< sizeof(str) << endl ;

我得到的输出是

size of char array:6
size of string:28

所以,我有两个问题

  1. 我可以得出结论,使用字符串将是一个愚蠢的想法,因为它占用了更多的空间,考虑到内存空间很紧并且数组中的最大字符数不会大于 10?
  2. 为什么字符串的大小显示为 28?基于什么?

std::string是C++中的class对象。它的大小是实现定义的,但通常需要至少一个指向堆分配字符串的指针和一个大小的空间。您看到的sizeof(std::string)可能特定于您的实现 - 但部分原因可能是由于小缓冲区优化,其中小字符串直接存储在字符串中。

char数组只是一个字符数组,因此sizeof(arr)始终是字符数。


至于你是否可以使用std::string:这取决于你的约束程度。std::string通常会对较大的字符串使用堆内存,这在极其受限的系统上可能很难证明是合理的。但是,大多数std::string实现还支持小缓冲区优化字符串,其中这些字符串直接存储在std::string中,而不是通过堆内存间接存储

如果堆内存不合理,std::string将不是一个好的解决方案。

但是,如果是这种情况,我建议您考虑采用现有的static_string实现,将大小编码为模板参数,或者至少编写自己的实现。这比在任何地方都使用char数组要好,因为这很难长期管理。