繁体   English   中英

参数传递礼仪(C ++)const&vs. value

[英]Parameter Passing Etiquette (C++) const& vs. value

如果函数需要的所有函数都看到它的值,那么你不应该总是通过常量引用传递该参数吗?

我的一位同事表示,对于小类型来说无关紧要,但我不同意。

这样做有什么好处:

void function(char const& ch){ //<- const ref
    if (ch == 'a'){
        DoSomething(ch);
    }
    return;
}

对此:

void function(char ch){ //<- value
    if (ch == 'a'){
        DoSomething(ch);
    }
    return;
}

它们看起来和我一样大小:

#include <iostream>
#include <cstdlib>

int main(){

    char ch;
    char& chref = ch;

    std::cout << sizeof(ch) << std::endl; //1
    std::cout << sizeof(chref) << std::endl; //1

    return EXIT_SUCCESS;
}

但我不知道是否总是如此。
我相信我是对的,因为它不会产生任何额外的开销,而且它是自我记录的。
但是,我想问社群我的推理和假设是否正确?

你的同事是对的。 对于小类型(char,int),当不修改变量时,通过引用传递是没有意义的。 传递值会更好,因为指针的大小(在通过引用传递的情况下使用)大约是小类型的大小。

而且,按值传递,输入较少,并且可读性稍差。

即使sizeof(chref)sizeof(ch)相同,通过引用传递字符在大多数系统上也需要更多的字节:虽然标准没有说明有关引用实现的任何特定内容,但地址(即指针)是经常在幕后传递。 通过优化,它可能无关紧要。 编写模板函数时,不应修改的未知类型的项应始终通过const引用传递。

对于小类型,您可以使用const限定符按值传递它们,以强调您不会通过函数的签名触及参数:

void function(const char ch){ //<- value
    if (ch == 'a'){
        DoSomething(ch);
    }
    return;
}

对于较小的值,创建引用和取消引用它的成本可能大于复制它的成本(如果存在差异)。 当您考虑参考参数几乎总是作为指针实现时,尤其如此。 如果你只是将你的值声明为const (我只使用这个值作为输入而且它不会被修改),那么两个文档都同样好。 我通常只使用const值和所有用户定义的/ STL类型将所有标准内置类型作为const &

你的sizeof示例存在缺陷,因为chref只是ch的别名。 任何类型T sizeof(T)都会得到相同的结果。

大小是一样的通过。 结果取决于ABI调用约定,但sizeof(referenceVariable)生成sizeof(value)

如果函数需要的所有函数都看到它的值,那么你不应该总是通过常量引用传递该参数吗?

这就是我的工作 我知道人们不同意我的观点,并且主张通过值传递小内置函数,或者更喜欢省略const 通过引用传递可以添加指令和/或消耗更多空间。 我通过这种方式保持一致性 ,因为总是测量任何给定平台的最佳传递方式是很难维护的。

没有超出可读性的优势(如果这是您的偏好)。 性能可能会受到轻微影响 ,但在大多数情况下不会考虑。

按值传递这些小内置更常见。 如果通过值传递,则可以使const限定定义(独立于声明)。

我的建议是,绝大多数团队应该只选择一种方式来传递并坚持下去,除非每一条指令都重要 ,否则表现不应影响到这一点。 const永远不会伤害。

在我看来,你通过const引用的一般方法是一个很好的做法(但请参阅下面的例子中的一些警告)。 另一方面,您的朋友是正确的,对于内置类型,通过引用传递不应导致任何显着的性能提升,甚至可能导致边际性能损失。 我来自C背景,所以我倾向于考虑指针的引用(即使有一些细微的差别),并且“char *”将比任何平台上的“char”更大熟悉。

[编辑:删除了不正确的信息。]

在我看来,底线是当你传递更大的用户定义类型时,被调用的函数只需要读取值而不修改它们,传递“type const&”是一个很好的做法。 正如您所说,它是自我记录的,并有助于阐明内部API的各个部分的角色。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM