我看过char* vs std::string in c++ ,但我仍然想知道访问 char*
的元素是否比 std::string
更快。
如果你需要知道,char*
/std::string
将包含少于 80 个字符,但我想知道一个截断值(如果有的话) .
如果存在差异,我还想知道针对不同编译器和不同操作系统的这个问题的答案。
提前致谢!
编辑:我将使用 array[n]
访问元素,并设置一次值。
(注意:如果这不符合帮助中心的要求,请告诉我如何在否决之前改写它)
最佳答案
它们通常应该是等效的,尽管 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
中的内部数据指针相同。
关于c++ - 访问 char* 或 std::string 的元素是否更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34455811/