我对推荐的编码技术有疑问.我有一个模型分析工具,我有时需要传递大量数据(从工厂类到拥有多个异构块的工厂类).
我的问题是,是否应该使用指针或移动所有权是否存在一些共识(我需要尽可能避免复制,因为数据块的大小可能大到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) 我正在打印计算的多次迭代的进度,输出实际上是它的最慢部分,但只有当我使用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++正在进行不必要的刷新.
有人会知道如何防止这种情况吗? …
我偶然发现了一种我意想不到的行为,也找不到相关文档。我有一个带有 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++ ×2
c# ×1
c++11 ×1
cout ×1
linq ×1
move ×1
performance ×1
pointers ×1
select ×1
visual-c++ ×1