是否更快地访问char *或std :: string的元素?

时间:2015-12-24 16:59:35

标签: c++ arrays string performance c++11

我见过char* vs std::string in c++,但我仍然想知道访问char*的元素是否比std::string更快。

如果您需要知道,char* / std::string将包含少于80个字符,但我想知道截止日期是否存在。

如果存在差异,我也想知道不同编译器和不同操作系统对这个问题的答案。

提前致谢!

编辑:我将使用array[n]访问元素,并将值设置一次。

(注意:如果这不符合帮助中心的要求,请告诉我如何在投票前重新改写)

2 个答案:

答案 0 :(得分:6)

它们通常应该是等效的,但std::string 可能稍微慢一些。为什么?因为短串优化。

短字符串优化是一些实现用于在std::string中存储短字符串而不分配任何内存的技巧。通常这是通过做这样的事情来完成的(虽然存在不同的变化):

union {
    char* data_ptr;
    char short_string[sizeof(char*)];
};

然后std::string可以使用short_string数组来存储数据,但前提是字符串的大小足够短以适应那里。如果没有,那么它将需要分配内存并使用data_ptr来存储该指针。

根据短字符串优化的实施方式,每当您访问std::string中的数据时,都需要检查其长度并确定它是使用short_string还是data_ptr。此检查不是完全免费的:它至少需要一些指令,可能会导致某些分支错误预测或禁止在CPU中进行预取。

libc ++使用类似requires checking whether the string is short vs long every access的短字符串优化。

libstdc ++使用短字符串优化,但它们的实现方式略有不同,实际上避免了任何额外的访问成本。 Their union is between a short_string array and an allocated_capacity integer,表示他们的data_ptr can always point to the real data(无论是在short_string还是在分配的缓冲区中),因此访问时不需要任何额外的步骤。

如果std::string不使用短字符串优化(或者如果它在libstdc ++中实现),那么它应该与使用char*相同。我不同意布莱克的说法,即在这种情况下存在额外的间接水平。编译器应该能够内联operator[],它应该与直接访问std::string中的内部数据指针相同。

答案 1 :(得分:3)

由于您无法直接访问基础CharT序列,因此通过公共接口访问它将需要额外的层。所以它可能会更慢,可能需要20-30个周期。即使这样,只有在紧密的循环中你才会看到差异。

但是,考虑到编译器可以使用的大量技术(缓存,内联,非标准函数调用等),如果您指示它,可以非常容易地优化它。