Fla*_*Cat 2 c++ arrays string performance c++11
我在c ++中看过char*vs std :: string,但我仍然想知道访问a的元素char*是否比快std::string.
如果您需要知道,char*/ std::string将包含少于80个字符,但我想知道如果有一个截止值.
如果存在差异,我也想知道不同编译器和不同操作系统对这个问题的答案.
提前致谢!
编辑:我将使用array[n],访问元素,并将值设置一次.
(注意:如果这不符合帮助中心的要求,请告诉我如何在投票之前重新改写它)
它们通常应该是等效的,尽管std::string 可能稍微慢一些.为什么?因为短串优化.
短字符串优化是一些实现用来存储短字符串std::string而不分配任何内存的技巧.通常这是通过做这样的事情来完成的(虽然存在不同的变化):
union {
char* data_ptr;
char short_string[sizeof(char*)];
};
Run Code Online (Sandbox Code Playgroud)
然后std::string可以使用short_string数组来存储数据,但前提是字符串的大小足够短以适应那里.如果没有,那么它将需要分配内存并用于data_ptr存储该指针.
根据短字符串优化的实现方式,无论何时访问a中的数据std::string,都需要检查其长度并确定它是否使用了short_string或者data_ptr.此检查不是完全免费的:它至少需要一些指令,可能会导致某些分支错误预测或禁止CPU中的预取.
libc ++使用这样的短字符串优化,需要检查字符串是否为每次访问时间长而不长.
libstdc ++使用短字符串优化,但它们的实现方式略有不同,实际上避免了任何额外的访问成本.它们的联合在一个short_string数组和一个allocated_capacity整数之间,这意味着它们data_ptr总是可以指向真实数据(无论它是在short_string分配的缓冲区中还是在分配的缓冲区中),因此访问它时不需要任何额外的步骤.
如果std::string不使用短字符串优化(或者如果它在libstdc ++中实现),那么它应该与使用a相同char*.我不同意布莱克的说法,即在这种情况下存在额外的间接水平.编译器应该能够内联operator[],它应该与直接访问内部数据指针相同std::string.