【发布时间】:2021-06-17 10:54:47
【问题描述】:
考虑两种实现类 Foo 变量加法的方法:
- 使用运算符重载:
Foo operator+(const Foo& rhs) - 使用成员函数:
void addAndAssign(const Foo &lhs, const Foo& rhs)
现在考虑两个等价的表达式a = b + c 和a.addAndAssign(b,c):
选项 1 会将加法的结果放入一个新变量中,然后将其移动分配到目标 a。但选项 2 将直接对变量 a 执行加法,无需赋值。
请记住,移动赋值并不能真正避免在具有静态分配成员的类上复制数据。对于包含静态分配的成员变量和数组的类型,这不会使二元运算符总是比等效的成员函数效率低吗?有没有办法解决这个问题?
【问题讨论】:
-
你知道Expression_templates吗?你如何实现
addAndAssign? -
记住,移动赋值并不能真正避免复制具有静态成员的类上的数据。静态成员与复制有什么关系?
-
缺少一些
constBTW。 -
效率问题:profile、profile、profile。确定效率的唯一方法是在您的平台上使用优化的代码对其进行衡量。
-
@Yksisarvinen 抱歉,我的意思是静态分配的成员(而不是使用 new/delete 动态分配的)。即,常规变量
float floatMember;.