问题标签 [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 投票
3 回答
1318 浏览

c++ - 为什么这个 Blitz++ 代码不能编译?

我是闪电战++新手。到目前为止,一切都很好,但我有点困惑为什么下面代码中的注释行无法编译

我在 Debian/Lenny (g++ 4.3.2, Blitz 0.9)。这是代码:

我确实喜欢被约束,所以很高兴知道是否有办法让它工作(到目前为止,Blitz++ 的经验表明,这可能只是选择正确的包括... )。

0 投票
2 回答
543 浏览

c++ - 使用表达式模板的中间结果

在 C++ 模板元编程中:来自 Boost 和 Beyond 的概念、工具和技术

...表达式模板的一个缺点是它们倾向于鼓励编写大而复杂的表达式,因为评估只会延迟到调用赋值运算符。如果程序员想要重用一些中间结果而不提前评估它,她可能会被迫声明一个复杂的类型,例如:

(或更糟)。请注意,这种类型不仅准确且冗余地反映了计算的结构,因此需要在公式更改时进行维护,而且还压倒了它?这是 C++ DSEL 长期存在的问题。通常的解决方法是使用类型擦除来捕获表达式,但在这种情况下,需要为动态调度付费。最近有很多讨论,由 Bjarne Stroustrup 本人带头,关于重用残留的 auto 关键字在变量声明中进行类型推导,以便将上述内容重写为:

这个特性对于 C++ DSEL 作者和用户来说将是一个巨大的优势......

是否有可能用当前的 c++ std. (非 C++0X)

例如,我想写一个表达式,如:

Expr X,Y

矩阵 A、B、C、D

X=A+B+C

Y=X+C

D:=X+Y

where operator := 在最迟时间计算表达式。

0 投票
6 回答
6055 浏览

c++ - C++ 表达式模板教程和介绍

C++表达式模板系统的创建有哪些好的介绍?我想表达用户定义类型的算术,同时避免临时值(可能很大),并学习如何直接执行此操作而不是应用现有库。

我找到了Todd Veldhuizen 的原始论文Josuttis C++ Templates book中的一个示例,以及Kreft & Langer的一篇文章。在Modern C++课程的第6讲中提到过,回溯到Josuttis。POOMA库背景很好地引入了表达式模板。

我正在寻找简单、清晰的说明。

0 投票
2 回答
1038 浏览

c++ - std::vector 的表达式模板运算符重载问题

我目前正在开发一个使用表达式模板的数值库。不幸的是,我遇到了运算符重载的问题。考虑以下精简示例。

使用 gcc 4.4.3 或 clang 2.8 编译时会给出以下错误消息:

出于某种原因,编译器会查找测试命名空间并找到我的通用运算符。我将这种形式与一些特质魔法一起使用,以减少我必须为操作员制作的版本数量。它应该接受 4 种不同的数据类型(包括 double 和 int),这会导致很多不同的组合。

有没有办法在不为每个运算符拼出所有组合的情况下完成这项工作?

0 投票
1 回答
574 浏览

c++ - 表达式模板未完全内联

我已经完成了数学库的第一个版本,下一步我想转向表达式模板来提高代码的性能。但是,我最初的结果与我的预期不同。我在 MSVC 2010 中以 vanilla Release 模式编译(并且可以使用 C++0x)。

为我将向您展示的大量代码提前道歉,它是我能做到的尽可能少,同时让人们看看我在做什么。分析框架:

表达模板向量:

手动内联:

结果:

表达式模板
总时间:14.172 平均时间:0.29525
分钟:0.281 最大:0.422

手动内联
总时间:8.438 平均时间:0.175792
分钟:0.171 最大:0.188

如您所见,表达式模板(显然)没有变成完全内联的代码。这是test()最后一次调用的 ,的反汇编std::clock()

表达式模板组装:

手动内联组装:

结论:无论出于何种原因,MSVC2010 都不会内联调用operator+. 有人知道这是为什么吗?即使 put __forceinline(我想避免)也不会内联。


更新:正如jdv-Jan de Vaan 提到的,当我删除析构函数时:

它内联operator+。奇怪的是,它将它内联到不同的程序集,我的测试表明这个输出虽然比我原来的性能好,但仍然没有达到与手动内联版本相同的状态。任何想法为什么会这样?

0 投票
2 回答
479 浏览

c++ - 连接 const_string 的

如何连接两个const_string?它的主页http://conststring.sourceforge.net/说引用:

它还使用表达式模板进行连接,有效地消除了创建中间临时对象所产生的开销。

所以我认为它最简单的形式

应该管用。但是 gcc-4.6 抱怨 operator+。为什么?我必须投和a吗?bstd::string

错误输出如下:

0 投票
4 回答
389 浏览

c++ - 使用表达式模板避免#define

使用以下代码,“hello2”不会显示,因为在第 3 行创建的临时字符串在第 4 行执行之前死亡。在第 1 行使用 #define 可以避免这个问题,但是有没有办法在不使用 #define 的情况下避免这个问题?(C++11 代码没问题)

澄清:

请注意,我相信 Boost uBLAS 存储引用,这就是我不想存储副本的原因。如果您建议我按值存储,请解释为什么 Boost uBLAS 是错误的,按值存储不会影响性能。

0 投票
2 回答
324 浏览

c++ - 模板函数的参数没有进行任何隐式转换

出于某种奇怪的原因,我无法将这段代码中的模板参数隐式转换为兼容类型。

失败:

因此,如果我是正确的,编译器应该会看到 main 函数中的代码如下:

  • ((a + b) + c)
  • 计算a + b
  • 使用转换运算符将a + bfromadd<...>的结果转换为vec<float, 2>add<...>
  • 计算(a + b) + c

但它从不进行隐式转换。如果我将 (a + b) 的结果显式转换为 vec,则代码可以正常工作。

0 投票
2 回答
765 浏览

c++ - 将 Boost.Proto 语法与类型匹配

我试图在 Boost.Proto 中创建一个匹配向量类型的语法,但是当我给它一个该类型的终端时,它与语法不匹配。类型定义如下所示:

我试图匹配的语法看起来像这样:

匹配失败:

如何制作与特定类型匹配的语法?

编辑:

似乎 proto::_ 和 proto::N 没有在自定义类型中用作通配符。该代码确实使用此语法编译(matches断言通过):

但是当任一通配符属于以下类型时不起作用:

或者:

因此,如果我不能使用我自己的类型的通配符,我如何测试表达式是否是包含向量的终端?

0 投票
1 回答
269 浏览

c++ - C++11:防止对象被分配给引用

有没有办法创建A这样的类型:

鉴于:

A f(...);

然后:

两者都auto&& a = f(...);给出const auto& a = f(...);编译错误?

这样做的原因是,在这种情况下,A是一个表达式模板,其中包含对临时对象的引用(作为 的参数提供f),所以我不希望这个对象的生命周期超出当前表达式。

请注意,我可以通过将s 复制构造函数设为私有并在需要时与 A 交朋友来防止auto a = f(...);成为问题。Af(...)

代码示例 (ideone链接)