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