【发布时间】:2011-06-30 19:54:15
【问题描述】:
我目前正在为低内存平台开发一个应用程序,该应用程序需要一个包含许多短字符串的 std::set(>100,000 个字符串,每个字符串包含 4-16 个字符)。我最近将此集合从 std::string 转换为 const char * 以节省内存,我想知道我是否真的避免了每个字符串的所有开销。
我尝试使用以下方法:
std::string sizeTest = "testString";
std::cout << sizeof(sizeTest) << " bytes";
但它只是给了我一个 4 个字节的输出,表明该字符串包含一个指针。我很清楚字符串在内部将它们的数据存储在 char * 中,但我认为字符串类会产生额外的开销。
std::string 的 GCC 实现是否比 sizeof(std::string) 所显示的开销更大?更重要的是,它在这种规模的数据集上是否重要?
这是我平台上相关类型的大小(它是 32 位,每个字节有 8 位):
字符:1 个字节
无效 *:4 个字节
字符 *:4 个字节
std::string: 4 字节
【问题讨论】:
-
你在什么平台上得到这个结果?我问是因为我见过一个字节被认为是 16 位的平台(Texas Instruments DSP)。
-
sizeof(char*)在您的平台上的结果是什么? -
我猜
std::string包含一个指向动态分配的字符串实现对象的指针。请记住,GCC 的字符串是 COW(写入时复制)。我尝试查看 gcc 的basic_string.h以获得一些见解,但尝试阅读神秘代码时感到头疼。 -
@Emile Cormier:字节中的位数由 CHAR_BITS 定义
-
字符串是不可变的吗?如果是这样,那么您可以节省空间。但是,如果它们需要被操纵,那么由于您引入的额外复杂性,您不太可能保存任何东西。
标签: c++ string compiler-construction memory-management