gpt4 book ai didi

c++ - char 和 char& 之间是否存在相对复制开销差异?

转载 作者:行者123 更新时间:2023-11-30 03:22:47 24 4
gpt4 key购买 nike

例如,

string str = "hello";
for (char c : str) { } // 1 copy
for (char& c : str) { } // 2 reference

1 和 2 之间是否存在相对复制开销差异? char 是 1 个字节。因此,在第一个 for 循环中,1 个字节从 str 复制到 c。在第二个循环中,它通过引用传递。这里引用传递就是复制指针地址(4字节)?我想知道它在内部是如何工作的。

最佳答案

C++ 标准对此不作任何保证。但是,几乎所有通用硬件上的现代编译器都应该将两个循环转换为完全相同的代码(假设启用了优化),因为复制 char 或访问对它的引用的语义在机器代码级别是无关紧要的。

以下三个主要的编译器正是这样做的:https://godbolt.org/g/XfRX38

volatile char x;

void fooCopy(std::string str)
{
for (char c : str) {
x = c;
}
}

void fooReference(std::string str)
{
for (char& c : str) {
x = c;
}
}

clang 将循环展开 8 倍,gcc 保持简单,MSVC 具有完全相同的循环体>gcc 但周围有更多的边界/堆栈检查样板。

但是,如果您关注循环体,那么对于每个编译器来说,两个函数(忽略标签和寄存器名称)之间的机器代码完全相同。


我个人不对内置数字类型使用 const 引用,因为我知道(在我使用 x86 的情况下)CPU 无论如何都会将它们保存在寄存器中并且复制它们没有开销。这不一定在每个硬件上都是正确的,但在那种情况下,您需要自己进行调查 - 很可能您的编译器比您更了解它。

关于c++ - char 和 char& 之间是否存在相对复制开销差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50820963/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com