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

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

我看过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_stringdata_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/

相关文章:

Python、Numpy : Cannot assign the values of a numpy array to a column of a matrix

reactjs - 是什么导致了 React 中这个令人惊讶的数组结果

c++ - 在 Ubuntu Linux 中使用 Nvidia 卡的 OpenCL 出现 -1001 错误

java - 对一个数组进行排序,其中多个连续的索引号形成一个应该放在一起的条目

c++ - C 中的 limit.h 未确认值

string - 查找子字符串的长度

python - 高效的字符串算法——正则匹配

c - 在递归函数中修改二维数组,C

c++ - 以高效的方式将 C 字符串转换为 std::vector<byte>

c++ - 如何在 beaglebone black 上用 C++ 创建这么多线程