问题标签 [expression-templates]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
218 浏览

c++ - Boost.Proto:Proto 转换是否可以评估矩阵和向量的混合表达式?

现在我正在尝试教 g++ 编译器线性代数,以便 g++ 可以重写表达式,例如(matrix * vector)(index)用于评估表达式的循环。基本上,这就是我所期望的作为“富有表现力的 C++ ”系列最后一篇文章的下一篇文章。上一篇文章解释了如何制作用于添加向量的 EDSL,因此我编写了另一个用于将矩阵乘以向量的 EDSL。

但是当我自己的矩阵和向量类的 Proto 域的名称作为第一个宏参数传递时,无法编译 BOOST_PROTO_DEFINE_OPERATORS 宏。

所以我想知道 Proto 转换是否有可能评估矩阵和向量对象的混合表达式。似乎没有可以编译的示例代码,Proto 用户指南 1.57.0中“将现有类型适配到 Proto”中的示例代码虽然是关于如何将现有矩阵和向量类型适配到 Proto,但并不完整。

我很茫然..你能给我一些建议或提示吗?

这是我的源代码。如果您能建议我如何解决它,我将不胜感激:

0 投票
1 回答
236 浏览

c++ - 表达式模板和求和符号

我正在为量子力学编写一个小型库,我想使用表达式模板来形成运算符表达式。特别是用表达式模板形成哈密顿量。

我基本上是按照这个源码来构造代码并重载相应的运算符 + * -:https ://en.wikipedia.org/wiki/Expression_templates

形成哈密顿量的表达式需要一个总和

其中 N 是一个 (const) 整数,u_i 也是 Vec 类型。在代码中编写此表达式有效,但我希望能够编写

如何做到这一点?

- - - - - - 编辑 - - - - - -

经过一些研究并在评论的帮助下,我想出了一个静态 for 循环的想法……谷歌搜索后,我在http://www.drdobbs.com/loops-metaloops-c/184401835?pgno找到了一篇文章=8这正是我所需要的。

0 投票
1 回答
91 浏览

c++ - 在奇怪重复的模板类中使用方法的返回类型作为另一个方法的参数类型

请考虑以下代码片段:

的参数类型应该i等于。出于合理的原因,在这里不起作用。出于同样的原因,在这里不起作用。vector_expression<E>E::size_typetypename E::size_typestd::result_of_t<decltype(&size)(vector_expression)>

那么,如果我们能做到,我们怎么能做到呢?

0 投票
1 回答
203 浏览

c++ - Expression templates not working for primitive type overloads under clang

I have a CRTP base class as follows:

Then the derived class is defined as

with defining my own operators in mind, I also have the following AddOperator which also inherits from base

Then the operator+ overload between a Derived type and a primitive type returns only a proxy/expression of sorts:

However, when I call this under clang I get garbage values for rhs of AddOperator. Here is an example:

The other overloads when both lhs and rhs in AddOperator are of type Derived do not have this problem.

This problem happens only under clang. gcc compiled code seems to run fine. Does anyone know where the problem is?

Full Demo Here

0 投票
1 回答
405 浏览

c++ - 深层嵌套表达式的表达式模板性能

我正在研究矩阵乘法中的表达式模板性能。我在矩阵乘法中展开循环,我发现本机双精度数的性能与表达式模板的性能相等,直到表达式的深度变得太大,表达式模板的性能下降。这是代码:

如果我取消注释矩阵乘法循环中的代码,并将 k 增加 32,则表达式模板需要三倍的时间。有谁知道为什么会发生这种情况?

我在 Intel Xeon E3-1225 V2 上的 cygwin 上编译 GCC 5.4。

0 投票
1 回答
123 浏览

c++ - 模板表达式如何摆脱临时变量

我正在阅读一些文章,其中很多都提到了表达式模板可以避免使用临时对象。但他们都没有提到这是如何完成的。据我所知,由于设计架构操作是使用临时对象完成的。例如,如果 a、b 和 c 是两个矩阵,如果我们这样做,a = b+c那么结果将b+c保存在一个临时对象中temp = b+c,然后将结果复制回一个 like a = temp

但是如果我们使用表达式模板,那么这个加法(+)操作返回 b 和 c 的引用,然后主要计算发生在赋值运算符(=)被评估时。这是模板表达式的简单通用概念。但我不明白它是如何摆脱临时对象的。如果有人能给出如何避免这种临时性的一般想法,那就太好了。

0 投票
2 回答
81 浏览

c++11 - Dlib 中使用的表达式模板技术是否仍然选择 C++11 中的移动语义?

随着移动语义的出现,我想知道在临时创建的对象能够在移动语义的帮助下传递所有权之后,King 在他的 dlib 库中实现的这种特定模板技术是否仍然有用,或者我在这里遗漏了什么?

0 投票
0 回答
85 浏览

c++ - 关于表达式模板期间临时对象的生命周期

我试图了解表达式模板的一个方面。

假设我们正在将该技术应用于矩阵。

假设我们有三个a,b,c类型的具体矩阵Matrix<double, ConcreteMatrix<double>>。这里的类Matrix<double, T>只是一个包含 type 成员的 shell TConcreteMatrix<double>是实际的矩阵类。

operator+()在应用于两个对象的表达式模板中a + b,返回一个类型为 的对象Matrix<double, Sum<type(a),type(b)>>,我在其中编写type(a)并且type(b)不会使代码更短且更易于阅读。

在内部,该类Sum<T,S>存储了两个对对象的**常量引用**ab.

我的问题是在计算时出现的(a + b) + c。好吧,更精确的计算Matrix<double, ConcreteMatrix<double>> d = (a + b) + c。让我在这里回忆一下,它operator=负责实际进行计算并填充d结果。

我们已经operator+(a, b)返回了Matrix真正的Sum内部。如果我理解正确的话,这个对象是临时的。让我们称之为pab。现在是执行的时候了。operator+(pad, c)这个返回一个类型的对象Matrix<double,Sum<type(pad),type(c)>>,其中包含对和的常量引用。我们称它为对象。pabcppabc

我了解 pab 在operator+(pad,c). 因此,可以创建ppabc包含对pab.

问题:但是当我们外出时会发生什么operator+(pad, c)pab我们出去的时候不应该“死”operator+(pad, c)吗?情况似乎并非如此。为什么?(我已经执行了 Todd Veldhuizen 和 David Vandevoorde 的书中所写的实现,它工作正常。)这意味着临时pab仍然存在于身体之外,operator+(pad, c)并且该运算符返回的对象仍然可以访问其引用pab并请求它包含的值。

我想确切地了解这个临时超出我想象的范围的根本原因是什么,因为我想应用表达式模板的技术来获得其他函数的惰性求值,比如exp(). 我遇到了麻烦(由于临时被破坏而导致的执行错误)。当我在其中存储一个具体对象而不是引用时,错误消失了Matrix<double, Exponential<type(a)>>。所以理解上面的问题会有所帮助。

0 投票
1 回答
1386 浏览

java - 在java中传递泛型类类型

我正在尝试查看是否可以在 Java 中模仿模板表达式模式,以进行循环融合等优化。

例如,我将此表达式模板示例中的 c++ 类移植到 java 类:https ://en.wikipedia.org/wiki/Expression_templates#Motivation_and_example

VecExpression<E>首先,一个表示向量表达式的模板类。它使用模板参数E并将类类型E作为构造函数参数。然后它创建一个私有变量thisAsE集以this转换为E

其次,一个类Vec扩展VecExpression<Vec>,它传递Vec.class给超级构造函数并实现类中调用的get()和方法。size()VecExpression<E>

VecSum<E1, E2>第三,扩展的模板类VecExpression<VecSum<E1, E2>,并使用其get()方法返回两个VecExpression<E>s 的和。类型作为显式参数传递Class<VecSum<E1, E2>> type

最后,我们使用表达式模板生成一个类,该类可以一次通过内存添加三个向量。

根据 Louis Wasserman 的评论编辑

但是,传递给VecSum构造函数的类类型不起作用,因为表达式试图从参数化类型中获取类。Louis 指出,泛型类的实现不会像在 c++ 中那样编译成不同的类。您将如何传递它们的类型,或者是否有另一种表达模板模式的方法?

0 投票
0 回答
101 浏览

c++ - 如何处理表达式模板中的复合语句/副作用

在为向量/数组类型实现表达式模板时,我不可避免地遇到了需要提供operator +=.

使用“默认”表达式模板方案会产生不直观的结果。表达式a += b不返回计算结果,而是对左操作数的引用,通过操作符的副作用,左操作数增加了 value b。如果operator+=()现在返回一个表达式模板而不是立即计算结果,a += b;则不会产生任何效果,这在使用此方案时可能会相当令人惊讶。

在表达式模板的上下文中是否有任何复杂的方法来处理复合赋值运算符和/或副作用?

我现在能想到三种可能:

  1. 使用默认表达式模板并记录必须评估表达式模板(通过提供的任何方式)。

  2. 使用具有析构函数的特殊表达式模板,必要时执行副作用计算。

  3. 提供完全不使用表达式模板而是立即执行副作用计算的复合赋值运算符。

我倾向于使用3,因为其他两个有各自的缺点。虽然1的那些可能相当明显,但2的问题是表达式模板的构造必须确保表达式副作用的实际计算不会抛出,如果要维护析构函数 noexcept。这在实践中可能是有问题的。