gpt4 book ai didi

c++ - GCC 中的表达式中间体(如果这就是它们的实际名称)

转载 作者:行者123 更新时间:2023-11-30 00:41:39 25 4
gpt4 key购买 nike

我正在尝试转换一个用 VS 编写的数学库,以便它可以通过 GCC 进行编译。问题是,我有很多看起来像这样的重载运算符:


template<code><typename T></code><br/>
inline quaternion<code><T></code> operator+(quaternion<code><T></code> &a, quaternion<code><T></code> &b)<br/>
{return quaternion<code><T></code>(a.x+b.x,a.y+b.y,a.z+b.z,a.w+b.w);}

等等。

问题是:这些运算符是在假设其他编译器支持为如下表达式创建的自动中间体的假设下设计的:


...<br/>
quaternion<code><T></code> q = log(exp(q0)*t);<br/>
...<br/>

如果没有它们,上面的内容需要变成:


...<br/>
quaternion<code><T></code> tmp = exp(q0);<br/>
tmp *= t;<br/>
quaternion<code><T></code> q = log(tmp);<br/>
...<br/>

这只是一个简单的例子。使用这个库的系统中的一些表达式会扩展到几百行——考虑到调试汇编式数字代码所涉及的开销,比如,一个超过 600 行的函数在最少。

在我看来,将重载运算符的整个机制引入语言只是为了为普通函数提供不同的命名约定,而在数学表达式方面没有提供真正的语法优势,这在我看来是不合理的。

但是,当然,我希望我的假设是错误的。

这让我想问:GCC 是否有能力创建自动中间体?如果不能,除了 MS 品牌之外还有哪些编译器能够做到这一点?

还是我完全以错误的方式解决了这个问题,并且有更好的技术来创建相同的效果?

最佳答案

您的非修改运算符需要通过const 引用获取它们的参数,例如

template<typename T>
inline quaternion<T> operator+(const quaternion<T> &a, const quaternion<T> &b)
{return quaternion<T>(a.x+b.x,a.y+b.y,a.z+b.z,a.w+b.w);}

标准 C++ 不允许您将未命名的临时值(您的中间值是)绑定(bind)到非常量引用。听起来 MSVC++ 可能允许将此作为​​扩展。

关于c++ - GCC 中的表达式中间体(如果这就是它们的实际名称),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3272569/

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