gpt4 book ai didi

c++ - 运算符优先级 C++ |进行计算的确切顺序是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:18:24 26 4
gpt4 key购买 nike

我正在尝试编写矩阵计算器,但遇到了困难。如果我有 A = B*C,那么 B*C 会用我重载的 operator*(const Matrix&) 求值,其中我需要一些用于我计算的临时对象。这很好用。但是一旦我遇到更复杂的东西,我就需要更多的临时对象,显然我不想手工做/有一个 miximum。

假设我要评估:

Matrix A = B*C + D*E*F + G*H;

然后运算符优先级告诉我,* 将首先被评估。所以:

Step 1) B*C -> t1
Step 2) D*E -> t2
Step 3) t2*F-> t3
Step 4) G*H -> t4
Step 5) t1+t2 -> t5
Step 6) t5+t4 -> t6
Step 7) A=t6

这是准确的顺序吗?还是订单是不确定的?我的想法是创建一个链表,我将检查我的 + 和 *,如果正在计算的对象(例如 t2*F)是临时的,那么我可以适本地删除它们/插入它们。

最佳答案

Expression templates可以解决这个问题。例如

Matrix M = 2*(A+B) + C;

通常会为 A+B 创建 3 个临时对象, 2*(A+B) , 2*(A+B) + C .所以当 Matrix 时这可能会变得低效对象是重量级的。

表达式模板是一种模板元编程技术,其中运算符被实现为返回一个表示整个表达式的对象,但仅在末尾计算表达式。

所以 2*(A+B) + C会产生一个类似

的类型的对象
sum<multiple<float, sum<Matrix, Matrix>>, Matrix>

能够计算M无需分配中间矩阵。 (在这种情况下,通过按分量加法和乘以常数)。该对象本身是在零运行时开销下生成的。

因为这很复杂,为此使用线性代数库可能会更好,例如 Eigen .

关于c++ - 运算符优先级 C++ |进行计算的确切顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30131496/

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