相关疑难解决方法(0)

表达模板:提高评估表达式的性能?

通过表达模板技术,一个矩阵表达式就像

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的建议总结相关链接

复制Elision

汽车告诉我们什么

C++中的通用引用11

C++ Rvalue引用说明

C++和2012年之后:Scott Meyers - C++中的通用引用11

c++ templates expression simplify

5
推荐指数
1
解决办法
993
查看次数

我们是否应该始终使用auto &&作为局部变量

读完这个帖子后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&&吗?

c++ auto c++11

4
推荐指数
1
解决办法
409
查看次数

访问 std::variant 中的公共结构成员

我无法理解如何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++ struct variant c++17

3
推荐指数
1
解决办法
353
查看次数

我怎样才能在c ++中迭代字符串向量?

我想在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)

c++ string file vector c-strings

2
推荐指数
1
解决办法
124
查看次数

标签 统计

c++ ×4

auto ×1

c++11 ×1

c++17 ×1

c-strings ×1

expression ×1

file ×1

simplify ×1

string ×1

struct ×1

templates ×1

variant ×1

vector ×1