引用本地可访问数据的正当理由
Valid reasons for References of locally accessible data?
所以我只是在关注我自己的事情,查看我写的一些代码,我注意到我做了一些事情。我引用了受保护的数据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";
}
编辑:我使代码实际上有效
引用只是引用对象的别名,因此像您一样在函数中使用它不会产生额外的内存开销或性能成本。如果它导致一个更干净的代码,我看不出有什么理由不使用它。
相关文章:
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在cuda线程之间共享大量常量数据
- C++将文本文件中的数据读取到结构数组中
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 如何在C++中序列化结构数据
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 在c代码之间共享数据的最佳方式
- 链表,反向函数,数据结构
- 方法应将 R 值引用作为输入是否有任何正当理由
- 引用本地可访问数据的正当理由
- C++读取元数据文件,并处理由空白和:混合分隔的字段
- 是否有正当理由在C++中使用 C 样式数组
- 使用宏是为了为可变模板实例化提供typedef,这是使用宏的正当理由
- 存在哪些正当理由使一元运算符过载&?