内联重载操作符c++
Inlining an overloaded operator c++
如果必须频繁使用重载操作符,可以/应该内联该操作符以获得更好的效率(wrt时间或其他)吗?
我想重载'+'操作符,以便在代码中频繁地添加大向量。因此问题来了。
理想情况下,您应该分析代码,然后决定内联什么。当你决定内联正则操作符和重载的操作符之间并没有太大的区别。
如果您正在添加大向量,那么函数调用的开销将相对于实际添加两个向量的时间较小。因此,将操作符标记为+ inline不太可能改善总体运行时间。
让编译器决定是否优化
关键字inline
是误导性的:编译器实际上总是可以做它需要做的事情,就像旧的 auto
(你还记得那些日子吗?)和register
。
它的现代含义是"在header中定义:不使用就丢弃,出现次数多就合并"。
编译器应该在发布版本中自动为您内联较小的函数。更重要的是定义move构造函数和move赋值。如果您的数组非常大,并且您同时执行多个操作,您还可以使用表达式类来提高执行速度。
template <class left, class right>
struct AddExpr {
const left& _left;
const right& _right;
AddExpr(const left& Left, const right& Right)
:_left(Left), _right(Right)
{assert(left.count() == right.count());}
int count() const {return _left.count();}
int operator[](int index) const {return _left[i]+_right[i];}
};
class Array {
int* data;
int size;
int count() const {return size;}
Array& operator=(AddExpr expr) {
for(int i=0; i<expr.count(); ++i)
data[i] = expr[i];
};
AddExpr operator+(const Array& lhs, const Array& rhs)
{return AddExpr<Array, Array>(lhs, rhs);}
AddExpr operator+(const Array& lhs, const Expr& rhs)
{return AddExpr<Array, Expr>(lhs, rhs);}
AddExpr operator+(const Expr& lhs, const Array& rhs)
{return AddExpr<Expr, Array>(lhs, rhs);}
AddExpr operator+(const Expr& lhs, const Expr& rhs)
{return AddExpr<Expr, Expr>(lhs, rhs);}
int main() {
Array a, b, c, d;
Array c = (a+b) + (c+d); //awesome on lines like this
}
这将删除所有临时对象,并大大提高缓存效率。但是我已经完全忘记这个技巧叫什么了
相关文章:
- 为什么map有操作符[],set没有
- 我可以将C 17 Capture lambda ConstexPR转换操作符的结果用作函数指针模板非类型参数吗?
- c++新操作符通过libstdc++占用大量内存(67MB)
- 复制/移动操作符是否可以安全地用于实现复制/移动分配操作符
- 提升::精神::因果报应使用有条件的替代操作符(|)
- 促进几何体操作符
- 如果操作符delete没有实现,为什么不编译它
- 在使用放置新操作符时,我真的需要担心对齐问题吗
- 我怎样才能让getline操作符工作
- 在重载的全局new操作符中使用静态对象会导致核心转储运行时错误
- 提升ipc new和delete操作符
- 在c++中使用new操作符动态分配数组
- 操作符的大小在C++
- 如何将向量中的对象传递给操作符
- 一个更容易的拷贝分配操作符实现
- 如何重写复杂的c++代码行(嵌套的三元操作符)
- boost::make_shared没有调用(放置)操作符new
- 新操作符(以及malloc)无法分配~450MB的内存
- 类、异常和操作符
- 当delete操作符释放内存时,我为什么需要析构函数