我见过char* vs std::string in c++,但我仍然想知道访问char*
的元素是否比std::string
更快。
如果您需要知道,char*
/ std::string
将包含少于80个字符,但我想知道截止日期是否存在。
如果存在差异,我也想知道不同编译器和不同操作系统对这个问题的答案。
提前致谢!
编辑:我将使用array[n]
访问元素,并将值设置一次。
(注意:如果这不符合帮助中心的要求,请告诉我如何在投票前重新改写)
答案 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个周期。即使这样,只有在紧密的循环中你才会看到差异。
但是,考虑到编译器可以使用的大量技术(缓存,内联,非标准函数调用等),如果您指示它,可以非常容易地优化它。