问题标签 [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.
c++ - 分配给表达式模板
我几乎没有 c++ 经验,但现在我需要看一些经常使用表达式模板的代码,所以我正在阅读《C++ 模板:完整指南》一书的第 18 章,并研究书中提供的示例. 如果您碰巧有这本书,示例从第 328 页开始,包含所有上下文信息。
我的代码工作正常,直到我想添加对子向量索引的支持(第 338 页),我无法让分配工作,g++ 给出以下错误:
我不知道发生了什么,我是否分配给一个常量对象?我该如何进行这项工作?这是我的代码:
抱歉它的长度,我未能创建一个最小(非)工作示例。
c++ - 使用 std::future 延迟对表达式的求值
我有一个Expr
使用表达式模板方法的类,它可以用来构建这样的表达式:
表达式在operator>>(T& val)
被调用时计算,即在>>
遇到时。让我们说一个eval
函数计算一个表达式,并在内部调用operator>>(T& val)
,它在Expr
类中定义:
现在,我想通过引入期货进一步延迟评估,直到用户需要结果。所以,我修改operator>>
为:
问题是如何/在哪里声明std::future<void> handle_
,以便我们以后可以轻松访问它。目前它是在全球范围内声明的,我不喜欢它。理想情况下,我希望将来成为Expr
课堂上的一员,这样我就可以做到这一点:
在这里,v.get()
会在内部调用handle_.get()
. 但是,这是不正确的,因为调用的对象operator>>
没有存储在任何地方,并且我试图调用get()
的单独实例Expr
,这将导致错误。
请建议。
c++ - 在使用表达式模板的矩阵库中为行类实现赋值运算符
假设我们有一个matrix
使用表达式模板的类,以便使用代理对象使编译器可以优化复合表达式。
row
现在,创建一个如下形式的类是很自然的:
以及以下形式的相应辅助函数:
这个想法是 arow
可能是实际matrix
对象的行或 a (temporal) matrix_expression
。
我现在要做的是配备
row
一个赋值运算符,以便我们可以将(兼容)vector_expression
s 分配给 arow
。当然,如果对象的关联不是“可分配的”,则应该禁用这样的运算matrix_expression
符row
。
这是一个有用的类型特征的第一个想法:
现在,问题是我们可能有一个
column
类和许多类似的类。所以,我正在寻找一种方法来实现上述想法,这种方法不会强迫我为每个类添加赋值运算符。
准确地说,我可以配备row
以下操作员:
但是,我需要将这样的运算符添加到column
该类以及任何其他此类的类中。
总而言之,我想在
vector_expression
级别上实现这一点,以便可以将“兼容”(即元素是可转换的)vector_expression
分配给“可分配”(在上述意义上)vector_expression
。我们怎么能做到这一点?
我已经隐藏了上面的实现细节,但这里有一个你需要回答我的问题的东西的现场演示。
c++ - GPU 的表达式模板
我使用模板元编程为 CPU 编写了一个向量表达式模板库。但是,我很难为给定的表达式创建 GPU 内核。请告知我如何在给定表达式树的情况下创建表达式字符串 (c = a + b),以及作为内核参数传递的参数列表。我已经在论文中阅读了有关这些技术的信息,但很难将其放入代码中。一个问题是我不知道如何存储要在表达式中使用的变量 (a,b,c) 的名称。我想只是给他们随机的唯一名称,如 x0、x1、x2 可能会起作用。一个代码片段会很有帮助。谢谢
以下是内核的模板,以及 c=a+b 的实际内核,取自“CUDA 表达式模板” https://pdfs.semanticscholar.org/5d08/a871b72f12a7ee40aeb2a69bca27a23733db.pdf
c++ - 表达式模板 - bad_alloc
我目前正在做一个 c++ 项目,现在我已经被困了一段时间。这是关于使用表达式模板和(至少对我而言)一个奇怪的 bad_alloc 的延迟评估。
如果您尝试下面的代码,您会注意到由于最后添加的 b+c 而导致的运行时错误 bad_alloc。这就是延迟评估完成的地方。此外,如果您删除“表达式”(左、右)成员的引用,下面的代码编译并运行良好。但由于性能等原因,我需要那里的参考资料。但是我也看不到,为什么我不能在那里使用引用。
我已经花了很多时间。请让我知道是否有人可以帮助我。
此致。
c++ - 如何为特定类型使用表达式模板?
使用表达式模板时,如何创建特化?从Wikipedia 示例中,我可以制作一个 Vector sum 模板类,如下所示:
根据维基百科,如果我有一个Vector
扩展类和一个使用运算符和循环VecExpression<Vector>
的类的构造函数,这将允许循环合并,因此如下语句仅使用单个循环:VecExpression
[]
我明白为什么会这样,但我不确定如何将其扩展到标量。我希望能够向整个 Vector 添加一个标量(int、float 或 double),但我不确定如何执行此操作。我最好的猜测是为 VecSum 类创建专业化,例如:
但这似乎比必要的工作要多得多,还有其他解决方案吗?
c++ - 为什么现代编译器没有消除对表达式模板的需求?
C++ 中表达式模板的标准音调是它们通过删除不必要的临时对象来提高效率。为什么 C++ 编译器不能删除这些不必要的临时对象?
这是一个我想我已经知道答案的问题,但我想确认一下,因为我在网上找不到低级别的答案。
表达式模板本质上允许/强制进行极端程度的内联。但是,即使使用内联,编译器也无法优化对的调用operator new
,operator delete
因为它们将这些调用视为不透明的,因为这些调用可以在其他翻译单元中被覆盖。表达式模板完全删除了对中间对象的调用。
这些多余的调用operator new
和operator delete
可以在一个简单的例子中看到,我们只复制:
在生成的代码中,我们看到foo()
编译为一个相对冗长的函数,其中两次调用operator new
和一次调用operator delete
whilebar()
编译为仅传输寄存器并且不进行任何不必要的复制。
这个分析正确吗?
任何 C++ 编译器都可以合法地删除其中的副本foo()
吗?
c++ - 线性链接工厂和移动语义
我尝试建立连锁工厂。
该链将使用移动语义来避免构造不必要的对象。
链接遵循 3 条规则:
除非一个工厂现在被标记为制造,否则两个工厂可以做一个表达式:
A_maker ^ B_maker<...>
变成一个Exp<A_maker, B_maker>
除非工厂现在被标记为 make,否则表达式和工厂会生成新的表达式:
Exp<...> ^ B_maker<...>
变成一个Exp<Exp<...>, B_maker<...>>
.
的语法
A_maker(..) ^ (B_maker(..).make())
会创建一个B<A>
对象。
我还没有实现 make 的逻辑B<B<A>>
,或者将需求从后来的工厂传递回早期的工厂。虽然对象的创建遵循工厂的顺序,但需求的传递与此顺序相反。
当前代码的问题在于它无法编译。
如何解决这个问题?
谢谢。
测试(也在coliru)
编译错误:
c++ - 表达式模板代码未完全优化
我在 C++ 中有以下线性代数函数调用(向量-向量加法)。
使用表达式模板(ET),我们可以将其包装如下:
矢量struct
看起来像的地方
强制转换为 non-const
是必要的,因为blasfeo_daxpy
需要非const
指针。ET代码很简单
“本机”调用,即blasfeo_daxpy(...)
生成以下程序集:
这正是您所期望的。ET 代码要长一些:
它涉及相当多的复制,即blasfeo_dvec
. 我(天真地,也许)希望 ET 代码会生成与本机调用完全相同的代码,因为所有内容在编译时都是固定的const
,但事实并非如此。
问题是:为什么会有额外的负载?有没有办法获得完全“优化”的代码?(编辑:我使用 Apple LLVM 版本 8.1.0 (clang-802.0.42) 和-std=c++14 -O3
)
c++ - c ++强制隐式转换作为参数传递
我对 C++ 中的隐式转换有疑问。
我正在尝试为向量算术创建一些表达式模板(我知道已经存在相同的库。我只是在学习 C++,所以我想尝试使用模板)。
我想创建类 Vector,它能够像这样计算:
,其中输出将是短裤矢量,因为 short 的类型比 char 大。
现在,我有一个类可以添加相同数据类型的向量。对于不同的类型,我必须调用显式转换:
是否可以在传递给函数“operator+()”之前隐式转换向量?这是我的向量代码: