小编Ada*_*eck的帖子

我应该使用指针还是移动语义来传递大块数据?

我对推荐的编码技术有疑问.我有一个模型分析工具,我有时需要传递大量数据(从工厂类到拥有多个异构块的工厂类).

我的问题是,是否应该使用指针或移动所有权是否存在一些共识(我需要尽可能避免复制,因为数据块的大小可能大到1 GB).

指针版本如下所示:

class FactoryClass {
...
public:
   static Data * createData() {
      Data * data = new Data;
      ...
      return data;
   }
};

class StorageClass {
   unique_ptr<Data> data_ptr;
...
public:
   void setData(Data * _data_ptr) {
      data_ptr.reset(_data_ptr);
   }
};

void pass() {
   Data * data = FactoryClass::createData();
   ...
   StorageClass storage;
   storage.setData(data);
}
Run Code Online (Sandbox Code Playgroud)

移动版本是这样的:

class FactoryClass {
...
public:
   static Data createData() {
      Data data;
      ...
      return data;
   }
};

class StorageClass {
   Data data;
...
public:
   void setData(Data _data) …
Run Code Online (Sandbox Code Playgroud)

c++ pointers move c++11

10
推荐指数
1
解决办法
3012
查看次数

极慢的std :: cout使用MS Compiler

我正在打印计算的多次迭代的进度,输出实际上是它的最慢部分,但只有当我使用Visual C++编译器时,MinGW才能在同一系统上正常工作.

考虑以下代码:

#include <iostream>
#include <chrono>

using namespace std;
#define TO_SEC(Time) \
    chrono::duration_cast<chrono::duration<double> >(Time).count();
const int REPEATS = 100000;

int main() {
    auto start_time = chrono::steady_clock::now();

    for (int i = 1; i <= REPEATS; i++) 
        cout << '\r' << i << "/" << REPEATS;

    double run_time = TO_SEC(chrono::steady_clock::now() - start_time);
    cout << endl << run_time << "s" << endl;
}
Run Code Online (Sandbox Code Playgroud)

现在用MinGW编译时得到的输出("g ++ source.cpp -std == c ++ 11")是:

100000/100000 
0.428025s
Run Code Online (Sandbox Code Playgroud)

现在,使用Visual C++ Compiler 2013年11月("cl.exe source.cpp")编译时得到的输出是:

100000/100000
133.991s
Run Code Online (Sandbox Code Playgroud)

这是非常荒谬的.我想到的是VC++正在进行不必要的刷新.

有人会知道如何防止这种情况吗? …

c++ performance cout visual-c++

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

IEnumerable.Select 在函数调用中重复输入参数

我偶然发现了一种我意想不到的行为,也找不到相关文档。我有一个带有 2 个参数的函数,其中一个具有默认值。当在 Select 内部调用该函数时,它出于某种原因获取调用它的值并将其应用于两个参数。例子:

具有以下功能:

private static Directions PrintDir(Directions dir, int distance = 1) 
{
    Console.WriteLine($"Direction {dir}, distance {distance}");
    return dir;
}
Run Code Online (Sandbox Code Playgroud)

如果单独调用,它会按预期运行:

using System;
using System.Linq;
                    
public class Program
{
    enum Directions { Left, Up, Right, Down };
    
    public static void Main()
    {
        PrintDir(Directions.Left);
        PrintDir(Directions.Up);
        PrintDir(Directions.Right);
        PrintDir(Directions.Down);
    }
}
Run Code Online (Sandbox Code Playgroud)

印刷:

Direction Left, distance 1
Direction Up, distance 1
Direction Right, distance 1
Direction Down, distance 1
Run Code Online (Sandbox Code Playgroud)

但是当在 LINQ 表达式中调用时:

using System;
using System.Linq;
                
public class Program
{
    enum …
Run Code Online (Sandbox Code Playgroud)

c# linq select

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

标签 统计

c++ ×2

c# ×1

c++11 ×1

cout ×1

linq ×1

move ×1

performance ×1

pointers ×1

select ×1

visual-c++ ×1