C++ 避免使用非常量引用参数

C++ 避免使用非常量引用参数,c++,C++,我遇到了这个,它更喜欢指针而不是引用 “在函数参数列表中,所有引用必须为常量: void Foo(常量字符串&输入,字符串*输出); 事实上,在Google代码中,输入参数是值或常量引用,而输出参数是指针,这是一个非常强大的约定。输入参数可以是常量指针,但我们绝不允许非常量引用参数,除非约定需要,例如swap()。” 这似乎与公认的答案有所不同,后者认为应该使用引用,除非函数涉及一些指针算法 所以我想知道这个输入参数是常量引用,输出参数是指针是谷歌风格的问题,还是更普遍接受的做法(避免非常量引用

我遇到了这个,它更喜欢指针而不是引用

“在函数参数列表中,所有引用必须为常量:

void Foo(常量字符串&输入,字符串*输出);

事实上,在Google代码中,输入参数是值或常量引用,而输出参数是指针,这是一个非常强大的约定。输入参数可以是常量指针,但我们绝不允许非常量引用参数,除非约定需要,例如swap()。

这似乎与公认的答案有所不同,后者认为应该使用引用,除非函数涉及一些指针算法


所以我想知道这个
输入参数是常量引用,输出参数是指针
是谷歌风格的问题,还是更普遍接受的做法(避免非常量引用参数)。

您没有提到这种编码做法的基本原理。我知道的主要原因是,当你用眼睛扫描一块代码时,它可以让你更清楚地看到所写的内容。即使您不记得每个被调用函数的确切功能,您仍然可以知道何时修改变量,因为您将看到它的地址被传递

此外,将函数更改为有时修改其中一个参数也不能悄悄地中断其他代码。你必须去每一个呼叫站点,通过指针进行呼叫。您可能会注意到其中一个呼叫站点是否需要您不更改该参数

我说不出这个公约被广泛接受或喜爱的程度,但据我所知,这就是它背后的原因


这可能会导致编译器输出的优化程度稍低。通过引用调用意味着调用方可以假设只有实际变量被修改,并且没有执行指针算法来修改同一数组的其他元素。(除非你有交叉文件编译,编译器不能知道指针的ARG到被调用的函数不被当作一个数组。)/P>你可以考虑这个可能性,上面提到的编码标准不是,就这样说,是世界上最好的……这是一个普遍接受的实践,就像使用输出参数的引用一样。使用引用似乎更受欢迎,这主要是由于C++标准库执行它的事实(即<代码> SWAP-())/>代码>。但仅仅因为某些东西不那么受欢迎,并不意味着除了谷歌以外的所有人都会回避它。谷歌以外的人也遵循同样的惯例。有些人不遵循这种做法,但认为这是完全可以接受的。我不记得见过任何强烈反对它的人。归根结底,这是一种观点,而不是教条。如果你不是被迫在工作中使用本指南,那么我不建议你使用它。阅读:这是真的吗?当然,代码可以通过const引用获取一个参数,然后获取其地址,丢弃const并添加到该参数上。这并不违反C++规范中的任何内容,所以优化器不能改变效果。@ DavidSvurz:“除非你有交叉文件编译”。所以(有意或无意地)他所说的是一个具有内部链接的函数,它可以通过w.r.t.调用(在同一个TU中)进行完全优化。现在,这很愚蠢,因为这是一个非常罕见的情况。但这并没有使他的陈述出错。@DavidSchwartz:我可能错了,但我认为编译器可以对别名做出假设。i、 e.如果将
&a[i]
作为非常量指针传递给函数,编译器将需要在调用后重新加载
a[i+1]
,即使它在被调用方保存的寄存器中有值。如果通过非常量引用传递
a[i]
,则不会出现这种情况。我可能错了,我最近没有读过。@LightnessRacesinOrbit:我说的是有效地进行整个程序优化的编译器选项。(
gcc-fwhole程序
,或
gcc-flto
(链路时间优化))。这在构建软件时流行过吗?我假设大型程序不使用它,因为它编译起来比较慢。@PeterCordes:你不需要这样做。您只需要在编译和链接阶段一致地使用
-flto