【问题标题】:Will a compiler remove effectless references? [duplicate]编译器会删除无效的引用吗? [复制]
【发布时间】:2020-03-09 11:08:20
【问题描述】:

情况是我想使用描述性变量名称作为成员变量,以便它们在标题中很好理解(例如:min_distance_to_polygon)。然而,在复杂的算法中,我发现使用更短的变量名称会更顺畅,因为上下文很清楚(例如 min_dist 在这种情况下)。

所以在方法的定义中我只写:

int & min_dist = min_distance_to_polygon;

这是否会在编译后产生开销,这是否是可接受的编码风格?

编辑:这会更好(因为它可以防止可能的复制)?

int & min_dist{min_distance_to_polygon};

【问题讨论】:

  • 对于int,即使您在没有编译器优化的情况下进行复制,您也可能不会注意到任何差异。当您必须在可读性和过早优化之间做出选择时,最好选择第一个
  • @foreknownas_463035818 嗯?甚至不会制作副本。如果没有省略引用,则会存储一个内存地址。
  • 不管编译器是否对此进行了优化,我认为我不喜欢你的策略:作为代码的读者,我会想知道这里到底发生了什么,为什么你看起来不必要地给变量起别名。我不会通过赋值重命名它(并删除不必要的引用!复制它),我会尝试重组算法以减少对冗长名称的引用。

标签: c++ reference


【解决方案1】:

编译器会删除无效的引用吗?

这取决于。如果可以的话,它可能会。该语言不要求优化,允许

这是否会在编译后产生开销,这是否是可接受的编码风格?

假设编译器优化了程序,在这种情况下开销是极不可能的。

一般来说,您可以通过比较生成的程序集是否包含引用来验证引用是否已优化。如果生成的程序集相同,则不会有任何开销。

更一般地,您可以通过测量来验证任何更改是否会产生重大开销。

这样会更好

int & min_dist{min_distance_to_polygon};

实际上是相同的。

【讨论】:

    【解决方案2】:

    这是否会导致编译后的开销

    不使用优化编译器,不。这是编译器的基本优化。事实上,由于编译器的值跟踪和/或 CPU 寄存器在幕后的实际工作方式(参见Register Renaming),即使复制值也可能不会导致任何开销(假设它保持不变)。

    这是可接受的编码风格吗?

    这是基于意见和有争议的。我假设存在代码,这是一个合理的选择,但这样的代码很少见。最后,由您来判断未来的读者是否会发现任一版本更易于阅读和理解。

    这样会更好吗(因为它可以防止可能的复制)?

    您显示的两个代码 sn-ps 在语义上完全相同 - 都是初始化。在X x = y; 中没有调用operator=(甚至在概念上)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 2013-02-22
      相关资源
      最近更新 更多