繁体   English   中英

C ++什么时候通过值与引用传递const struct参数有意义?

[英]C++ When does it make sense to pass a const struct parameter by value vs. reference?

我已经看到了与此类似的问题,但我想澄清一下...

假设一个基本的C ++类:

class MyClass
{
public:
    struct SomeData
    {
        std::wstring name;
        std::vector<int> someValues;
    };

    void DoSomething(const SomeData data);
}

我知道data将作为const传递给DoSomething ,这没关系,因为该函数不会以任何方式修改data ...但是我习惯于使用const参数来查看&指定,以确保它们通过引用传递,例如

void DoSomething(const SomeData& data);

对我来说,这似乎更有效率。 如果我们省略& ,那么data不是通过值传递给DoSomething吗? 我不确定为什么在可以通过引用传递并避免复制发生时最好通过值传递const参数?

按值/引用传递和const正确性是两个不同的概念。 但是一起使用。

价值传递

 void DoSomething (SomeData data);

如果复制成本较低且不想保留对异物的引用,则使用按值传递。 在某些情况下,此函数可以(如果在类中)保留指向此函数的指针并拥有自己的副本。

通过参考

void DoSomething (SomeData& data);

如果您知道复制结构可能会导致性能下降,请务必使用按引用传递。 在某些情况下,此函数可以(如果在类中)保留指向此对象的指针并指向异物。 保持指向异物的指针意味着您应该了解它的寿命以及该异物何时超出范围。 更重要的是,异物的变化会出现在您的指针上。

const正确性

void DoSomething (const SomeData data);  // const for local copy
void DoSomething (const SomeData& data); //  const for callers object

const添加为按值或引用传递意味着此函数不会更改它。 但是没有或没有&决定您要添加修改对象的安全性。 就文档API而言, const是C ++中非常有用的工具,可提供编译时安全性,并允许更多编译器优化。

阅读本文。

void DoSomething(const SomeData data)最大的问题是它使接口和实现void DoSomething(const SomeData data) 从调用者的角度来看, const不会改变任何东西。 该函数仍然会收到一个副本,并且原始对象不会被修改。 实现对其自己的函数内部副本执行的操作或不执行的操作不应打扰调用方,因此不应在接口中表达。

如果不更改副本, const确实会使实现更加const正确,但是将实现细节泄漏到接口中需要付出很高的代价。 我建议不要使用void DoSomething(const SomeData data)

与往常一样,此处的绩效收益或损失不应被高估。 更多关于语义和约定。

传递const值对于调用者来说主要是信息性的,它表明了意图。 这对于使代码易于阅读,理解和维护很重要。

如果编译器知道该函数未修改其参数,则可能还可以添加一些其他优化。 例如,这可能导致编译器根本不执行复制。

这个:

void DoSomething(const SomeData data);

有点不寻常,因为尽管它对于调用方(可以传递const或非const值)不做任何更改,但它限制了函数可以在内部执行的操作。 这样做没有太多价值,而且通常也不做。

如果复制值昂贵,包括在目标平台上大约大于两个指针,则按引用传递(是否传递const)会更有效。 换句话说,如果SomeData是包含两个整数的结构, SomeData值传递它可能会更有效。 但是,如果其中包含std::map或一些较大的数据,则最好通过引用将其传递。

例外情况是,如果函数仍要复制该值,则最好按值进行取值,因为如果调用者允许,则该值可能被“移动”而不是被复制。

暂无
暂无

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

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