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

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(使用前将#替换为@)

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

  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • 按扩展名过滤搜索文件返回太多结果

    我正在开发一个 C 控制台应用程序 它必须管理 Windows 操作系统上的文件 我需要获取具有特定扩展名的文件名 列表 我找到了很多解决方案 最建议的是以下一种 HANDLE hFind WIN32 FIND DATA data hFin
  • 现代 C++ 编译器是否能够在某些情况下避免调用 const 函数两次?

    例如 如果我有以下代码 class SomeDataProcessor public bool calc const SomeData d1 const SomeData d2 const private Some non mutable
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • cpp.react库的C++源代码中奇怪的“->* []”表达式

    这是我在文档中找到的 C 片段cpp react 库 https github com schlangster cpp react implicit parallelism auto in D MakeVar 0 auto op1 in g
  • 已发布的 .Net Core 应用程序警告安装 .Net Core,但它已安装

    我制作了一个 WPF 和控制台应用程序 供某人在我无法访问的私人服务器上使用 我使用 Visual Studio 2019 的内置 发布向导 来创建依赖于框架的单文件应用程序 当该人打开 WPF 应用程序时 他们会看到标准警告 他们单击 是
  • 从 C# 使用 Odbc 调用 Oracle 包函数

    我在 Oracle 包中定义了一个函数 CREATE OR REPLACE PACKAGE BODY TESTUSER TESTPKG as FUNCTION testfunc n IN NUMBER RETURN NUMBER as be
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • 如何最好地以编程方式将 `__attribute__ ((unused))` 应用于这些自动生成的对象?

    In my makefile我有以下目标 它将文本 HTML 资源 编译 为unsigned char数组使用xxd i http linuxcommand org man pages xxd1 html 我将结果包装在匿名命名空间和标头保
  • Oauth2中如何同时撤销RefreshToken和使AccessToken失效

    我正在使用 Owin Oauth2 授权和资源服务器相同 开发单页面应用程序 AngularJS Net MVC Json Rest API 的身份验证流程 我选择了 Bearer Token 路由而不是传统的 cookie session
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点

随机推荐