引用本地可访问数据的正当理由

Valid reasons for References of locally accessible data?

本文关键字:数据 正当理由 访问 引用      更新时间:2023-10-16

所以我只是在关注我自己的事情,查看我写的一些代码,我注意到我做了一些事情。我引用了受保护的数据float& px = A->p.x这样做纯粹是为了缩短 if 语句的宽度并使其更具可读性。当然,该函数被声明为类的朋友,因此它可以访问受保护的数据。此外,还有4个类似的参考文献。

我想知道这是否是参考的正当理由。如果没有正当理由创建一个引用,该引用绝不是正在使用的函数的参数。

例:

void generic_function(A_class* A)
{
float& x = A->x;
//purposeful and valid code using x?
}

试图尽我所能地表达这个问题,如果它没有传达我提问的目的,我深表歉意。

编辑:作为一个重要的点。我关心的是实时应用程序设计的优化。

当然,这是使用引用的一种非常有效的方法。任何时候,当您需要内存中另一个位置的替身来缩短代码时,引用都是完美的选择。在您的情况下,它还缩短了取消引用的链条:如果您多次使用x,例如,在一个循环中,您将减少取消引用的数量,因为您不再需要读取A即可访问其中的x。编译器可能足够聪明,可以为您优化此取消引用,因此您不应该将其作为微优化的问题。

使用引用的另一个正当理由是访问容器内的缓存值。从std::map访问缓存值的常见模式是将值读入引用,对其进行检查,然后分配给引用,从而绕过映射中的第二次查找。这样做的时间可能很重要,尤其是在紧密循环中,因此使用对映射的引用可以被视为一种优化技术。

我已经多次使用它来做这样的事情:

// logFile is optional; if set, the function will log to that file
// If it's empty, it will log to stderr
void foo(const std::string& logFile)
{
    std::ofstream file;
    std::ostream& os = (logFile.empty()) ? std::cerr : file;
    if (!logFile.empty())
    {
        file.open(logFile);
        // validate that the file opened successfully, etc.
    }
    // Then, throughout the function, I can just use os rather than writing
    // an if statement every time I log something
    os << "Hello world!n";
}

编辑:我使代码实际上有效

引用只是引用对象的别名,因此像您一样在函数中使用它不会产生额外的内存开销或性能成本。如果它导致一个更干净的代码,我看不出有什么理由不使用它。