gpt4 book ai didi

c++ - C++ 对齐的 future : passing by value?

转载 作者:IT老高 更新时间:2023-10-28 22:01:54 27 4
gpt4 key购买 nike

阅读 Eigen 库文档,我注意到 some objects cannot be passed by value . C++11 中是否有任何开发或计划开发可以安全地按值传递此类对象?

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

最佳答案

完全有可能 Eigen 只是一个写得很糟糕的库(或者只是考虑不周);仅仅因为某些东西在线并不能使它成为现实。例如:

Passing objects by value is almost always a very bad idea in C++, as this means useless copies, and one should pass them by reference instead.

这不是一个好的建议一般而言,具体取决于对象。有时在 C++11 之前是必需的(因为您可能希望对象不可复制),但在 C++11 中,从不需要。您可能仍然会这样做,但始终需要始终通过引用传递值。如果它包含分配的内存或其他东西,您可以按值移动它。显然,如果它是一种“看但不触碰”之类的东西,const& 就可以了。

简单的结构对象,大概像 Eigen 的 Vector2d 可能足够便宜来复制(尤其是在 x86-64 中,指针是 64 位),复制在性能方面没有多大意义.同时,它开销(理论上),所以如果你在处理性能关键代码,它可能会有所帮助。

再一次,它可能不会。

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

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

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

不过,C++11 有 alignas 关键字,这是声明对象应具有某种对齐方式的标准方法。

Also, why is there no problem with returning such objects by value?

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

关于c++ - C++ 对齐的 future : passing by value?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10019228/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com