C++ 对齐的未来:按值传递?

2024-02-10

阅读 Eigen 库文档,我注意到有些对象不能按值传递 http://eigen.tuxfamily.org/dox/TopicPassingByValue.html。 C++11 中是否有任何开发或计划开发可以安全地按值传递此类对象?

另外,为什么按值返回这样的对象没有问题呢?


Eigen 完全有可能只是一个写得很糟糕的库(或者只是考虑不周);仅仅因为某些东西在网上并不意味着它就是真的。例如:

在 C++ 中按值传递对象几乎总是一个非常糟糕的主意,因为这意味着无用的副本,而应该通过引用传递它们。

这不是一个好建议一般来说,取决于对象。有时在 C++11 之前是必要的(因为您可能希望对象不可复制),但在 C++11 中,它是never必要的。你可能仍然会这样做,但它永远不会必要的始终通过引用传递值。如果它包含分配的内存或其他内容,您可以按值移动它。显然,如果这是一种“看而不摸”之类的事情,const&很好。

简单的结构对象,大概像 Eigen 的那样Vector2d复制的成本可能足够低(特别是在 x86-64 中,其中指针是 64 位),因此复制对性能而言意义不大。同时,它is开销(理论上),所以如果您使用性能关键的代码,它可能会有所帮助。

但话又说回来,也可能不会。

Eigen 似乎正在谈论的特定崩溃问题与对象的对齐有关。然而,大多数 C++03 编译器特定的对齐支持保证了所有情况下的对齐。所以没有理由“让你的程序崩溃!”。我从未见过基于 SSE/AltaVec/etc 的库使用特定于编译器的对齐声明,从而导致值参数崩溃。而且我用过不少。

因此,如果他们遇到某种崩溃问题,那么我会认为 Eigen 具有......可疑的优点。并非没有进一步调查。

另外,如果一个对象按值传递是不安全的,正如 Eigen 文档所建议的那样,那么处理这个问题的正确方法是使该对象不可复制构造。复制分配就可以了,因为它需要一个已经存在的对象。然而,Eigen 并没有这样做,这再次表明开发人员错过了 API 设计的一些细节。

然而,根据记录,C++11 有alignas关键字,这是声明对象应具有某种对齐方式的标准方法。

另外,为什么按值返回这样的对象没有问题呢?

谁说不存在(注意复制问题,而不是对齐问题)?区别在于您不能通过引用返回临时值。所以他们没有这样做,因为这是不可能的。

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

C++ 对齐的未来:按值传递? 的相关文章

随机推荐

  • 程度报告问题并行测试

    我有以下报告代码 public class Reporting private ExtentHtmlReporter extentHtmlReporter private static ThreadLocal
  • 如何在 React Native 中获取组件在屏幕上的位置?

    我正在开发一个反应本机应用程序 我想处理屏幕上的触摸 一个用例是当用户在屏幕上 按下 时 我希望能够获取屏幕上特定组件的位置 x y 以了解它是否与触摸的 x y 匹配 我已经搜索过堆栈溢出 但给定的解决方案都不起作用 在我的根组件中 on
  • 分析 pyomo 中的解决方案 (.sol) 文件

    我在机器 1 中有一个 pyomo 模型 在机器 2 中有 CPLEX 求解器 我转换 pyomo 模型 ConcreteModel 变成problem lp带有函数的文件model write problem lp 在机器 1 中 然后我
  • jQuery 在两个类之间滚动切换

    默认情况下 我有一个具有红色背景颜色的导航栏 我想要做的是 当用户向下滚动超过 100px 将背景更改为蓝色 并且如果他返回到 0px 将背景更改为其默认状态 例如 我想通过在两个类之间切换来做到这一点 div class navigati
  • perl + 如何声明数组

    以下脚本 test pl 在 myfile txt 文件的 first line 1 和 second line 1 之间附加 insert 1 文本 并将输出发送到 output txt 但如果我将数组声明为 my first line
  • 尝试在flutter中创建不同语言的pdf

    我想在 PDF 中打印印地语 我也尝试过使用 Google 的 Raleway Regular ttf 字体 但也没有成功 final font await rootBundle load fonts ARIAL TTF final ttf
  • 我的 SQLite 语法错误

    SQLite 新手 所以我不知道我做错了什么 我刚刚收到一条错误消息 SQLSTATE HY000 General error 1 near CREATE syntax error 这是我的 SQL CREATE TABLE users i
  • 如何转置 MySQL 行和重复列标题?

    我有一个 mysql 表 如下所示 id group id item code item label item detail item score 1 10 BLU123 Blue 123 Blah blah 123 3 2 10 BLU1
  • 我可以让实时 PHP 数据显示在 jquery 对话框中吗?

    我正在尝试将两种想法结合起来 但我不确定它们是否相互兼容 想法一 让 php 脚本运行命令 例如 ping 并在 Web 浏览器中提供命令的实时结果 想法2 出现一个 jQuery 对话框 打开时运行 php 脚本并在对话框中提供实时结果
  • 如何从 Diego 上的 Cloud Foundry 提取文件

    我想检索一些应用程序的日志 我发现这个命令cf file不再可用 该插件cf download 不适用于迭戈建筑 https github com ibmjstart cf download issues 12 有没有办法通过 CLI 其他
  • 检查静态库的iOS部署目标

    我有很多静态库 比如libBlah a With file我可以检查支持的架构的工具 arm64 或 i386 有没有工具可以检查iOS Deployment Target静态库的 您可以使用otool检查库文件 通过一些实验我发现标志 l
  • 小米等智能手环官方SDK/API

    我们想要开发一个 Android 应用程序来支持 MiBand 和其他智能手环 我们希望通过 BLE 从智能手环获取心率等信息 并将其显示在移动应用程序中 我们如何从设备获取这些信息 有官方的SDK或者API吗 还有一个 huami tec
  • Hibernate/JPA 中批量插入 CollectionTable 元素

    我们使用 Hibernate 4 2 作为 JPA 2 0 实体的支持库 我们有一个如下所示的实体 Entity public class MyEntity ElementCollection MapKeyColumn name key C
  • 为什么我的交易没有升级为 DTC?

    我的机器上禁用了 DTC 据我了解 这段代码应该失败 因为它在同一事务中使用两个数据上下文 那么 它为什么有效呢 注意 我使用 NET 3 5 和 NET 4 0 尝试过此操作 using TransactionScope transact
  • Python lxml解析svg文件

    我正在尝试解析 svg 文件http kanjivg tagaini net http kanjivg tagaini net 但我无法成功提取里面的信息 Edit 1 完整文件 http www filedropper com 0f9ab
  • IBM data studio 未连接到本地 DB2 数据库

    我已经在本地 Ubuntu 12 04 机器上安装了 DB2 10 5 版本 现在我需要一个图形用户界面 我已经尝试过 squirrel sql 和 Db Visualizer Db Visualizer 为我提供了仅查看的数据库结构 而
  • 一个项目有两个 gitlab-ci 运行程序

    我曾经在github上有一个项目travis https travis ci org and an appveyor https www appveyor com 已配置集成服务 因此我能够确保我的项目在两个平台上都可以正常编译OSX an
  • 使用协程API获取实体

    最好的使用方法是什么coroutines使用 LiveData 从数据库中选择一些数据Room 这是 My Dao 课程 暂停选择 Dao interface UserDao Query SELECT from user table WHE
  • 如何使用 --split-debug-info=/<项目名称>/<目录>

    下面的命令中 如何使用 split debug info
  • C++ 对齐的未来:按值传递?

    阅读 Eigen 库文档 我注意到有些对象不能按值传递 http eigen tuxfamily org dox TopicPassingByValue html C 11 中是否有任何开发或计划开发可以安全地按值传递此类对象 另外 为什么