通过表达模板技术,一个矩阵表达式就像
D = A*B+sin(C)+3.;
Run Code Online (Sandbox Code Playgroud)
就计算性能而言,它与手写for循环几乎相同.
现在,假设我有以下两个表达式
D = A*B+sin(C)+3.;
F = D*E;
cout << F << "\n";
Run Code Online (Sandbox Code Playgroud)
在表达模板的"经典"实现中,计算性能将与for顺序中的两个循环的计算性能几乎相同.这是因为在=遇到运算符后立即计算表达式.
我的问题是:是否有任何技术(例如,使用占位符?)来识别D实际上未使用的值,并且感兴趣的值是唯一的元素F,因此只有表达式
F = E*(A*B+sin(C)+3.);
Run Code Online (Sandbox Code Playgroud)
评估并且整个性能等同于单个for循环的性能?
当然,这种假设技术也应该能够返回来评估表达
D = A*B+sin(C)+3.;
Run Code Online (Sandbox Code Playgroud)
如果稍后在代码D中需要值.
预先感谢您的任何帮助.
编辑:结果试验了Evgeny提出的解决方案
原始说明:
Result D=A*B-sin(C)+3.;
Run Code Online (Sandbox Code Playgroud)
计算时间:32ms
两步说明:
Result Intermediate=A*B;
Result D=Intermediate-sin(C)+3.;
Run Code Online (Sandbox Code Playgroud)
计算时间:43ms
解决方案auto:
auto&& Intermediate=A*B;
Result D=Intermediate-sin(C)+3.;
Run Code Online (Sandbox Code Playgroud)
计算时间:32ms.
总之,auto&&能够恢复单个指令案例的原始计算时间.
编辑:根据Evgeny的建议总结相关链接
读完这个帖子后auto&&,是否应该总是使用auto&&而不是auto当我们声明一个局部变量来捕获一个函数的返回类型时(为了完全保留函数返回的类型)?
例如,用例可以是
auto&& result = func_returning_lvalue_or_lvalue_reference();
Run Code Online (Sandbox Code Playgroud)
要么
auto&& iterator = vector_.begin();
Run Code Online (Sandbox Code Playgroud)
或其他任何东西.
换句话说,拥有大量基本代码是正常的auto&&吗?
我无法理解如何std::variant在 C++17 中使用。给定两个 struct AandB和 a std::vector<std::variant<A,B>> vs,我想:
n;fun()或add()。#include <iostream>
#include <variant>
#include <vector>
struct A {
int n;
void fun() { std::cout << "fun\n"; }
int add(int m) { return n+m; }
};
struct B {
int n;
void fun() { std::cout << "fun\n"; }
int add(int m) { return n+m; }
};
int main() {
std::vector<std::variant<A,B>> vs;
vs.push_back(A{10,11});
vs.push_back(B{20,22});
// How to refer to …Run Code Online (Sandbox Code Playgroud) 我想在c ++中迭代字符串向量.我想用fopen打开列表中的每个项目.
const char *filep //fopen needs a constant char pointer.
for (vector<string>::iterator it = filelist.begin(); it != filelist.end(); it++)
{
filep = (const char *)it; //This isn't working. How can I fix this
fopen(filep, "rb");
}
Run Code Online (Sandbox Code Playgroud)