值语义与具有大型数据结构的输出参数

2023-11-22

2013 年主题演讲:Chandler Carruth:优化 C++ 的新兴结构

  • 42:45
    您不需要输出参数,我们在 C++ 中有值语义。 ...每当你看到有人争论 nonono 我不会按值返回,因为复制成本太高,从事优化器工作的人就会说他们错了。好的?我还没有见过任何一段代码表明这个论点是正确的。 ...人们没有意识到值语义对优化器有多么重要,因为它完全澄清了别名场景。

任何人都可以将此放在这个答案的上下文中:https://stackoverflow.com/a/14229152

我听说不断重复,但是,对我来说,返回某些内容的函数是source。通过引用的输出参数从函数中获取该特征,并且从函数中删除这种硬编码特征允许人们在外部进行管理,即如何存储/重用输出。

我的问题是,即使在那个答案的背景下,有没有办法告诉,重组代码其他一些相等的方式,“现在看看,这种方式的值语义不会丢失输出参数版本”,或者 Chandler 评论特定于某些人为的情况?我什至看到安德烈·亚历山德雷斯库(Andrei Alexandrescu)在一次演讲中争论这个问题并告诉您无法逃避使用 by ref 输出以获得更好的性能。

对于安德烈评论的另一种看法,请参见Eric Niebler:输出参数、移动语义和状态算法.


这要么是夸大、概括、笑话,要么是 Chandler 的“完美合理性能”(使用现代 C++ 工具链/库)的想法对我的程序来说是不可接受的。

我发现它的优化范围相当狭窄。惩罚超出了这个范围,由于程序中的实际复杂性和设计,不能忽视这一点 - 堆分配就是一个例子getline例子。尽管您尝试减少特定的优化,但它们可能始终适用于相关程序,也可能并不总是适用。现实世界的结构将引用可能存在别名的内存。您可以减少这种情况,但相信您可以消除混叠(从优化器的角度来看)是不切实际的。

当然,RBV 可能是一件很棒的事情 - 只是它并不适合所有情况。甚至您引用的链接也指出了如何避免大量分配/释放。真实的程序和其中的数据结构要复杂得多。

在演讲的后面,他继续批评成员函数的使用(参考:S::compute())。当然,有一点需要注意,但是完全避免使用这些语言功能真的合理吗,因为它使优化器的工作更容易?不会。它总是会产生更具可读性的程序吗?不会。这些代码转换是否总能带来明显更快的程序?不。转换代码库所需的更改值得您投入时间吗?有时。您能否吸取一些观点并做出更明智的决策,从而影响您现有或未来的某些代码库?是的。

有时,它有助于分解程序的执行方式,或者它在 C 中的样子。

优化器不会解决所有性能问题,并且您不应该假设您正在处理的程序是“完全脑死亡和损坏的设计”来重写程序,也不应该相信使用 RBV 总是会导致“完美合理的性能” ”。您可以利用新的语言功能并使优化器的工作变得更轻松,尽管可以获得很多好处,但通常还有更重要的优化需要投入时间。

考虑一下提议的改变是没问题的;理想情况下,在采用这些建议之前,您应该衡量此类更改对现实世界执行时间的影响以及对源代码的影响。

对于您的示例:即使按值复制+分配大型结构也会产生巨大的成本。除了运行构造函数和析构函数的成本(以及它们获取和拥有的资源的相关创建/清理,如您引用的链接中指出的)之外,即使像避免不必要的结构复制这样简单的事情也可以为您节省大量 CPU如果您使用参考文献,则需要时间(如果适用)。结构副本可能就像一个简单的memcpy。这些不是人为的问题;而是人为的问题。它们出现在实际的程序中,并且复杂性会随着程序的复杂性而大大增加。减少某些内存的别名和其他优化是否值得付出成本,并且它是否会带来“完全合理的性能”?不总是。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

值语义与具有大型数据结构的输出参数 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern

随机推荐