小编jav*_*red的帖子

在x64系统上可以为nullable double和decimal更新原子?

在大多数情况下double,decimal64位系统上的类型更新是原子操作,因为这些类型是64位.(十进制是128位,所以这是错误的,感谢您的评论)

但是当我更新double?decimal?输入64位系统时它会是原子的吗?什么是大小double?decimal?

我知道原子性并不能保证,尽管我仍然感兴趣,如果这种更新在一般情况下是原子的.

c# atomic

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

如何防止一系列整数经常具有相同的值

我有“在线”系列整数,所以每隔几毫秒我就有一个新数字。频率未指定 - 有时我有很多数字,有时我没有数字。

实际上,这些数字就是所谓的股票“真实价格”。我在我的交易应用程序中使用它。

现在我只使用最后一个数字作为“真实价格”,所以我根本不跟踪系列。但是这种方法存在一些问题。我们来看看这个系列:

  1. 98; 最后= 98
  2. 100; 最后= 100
  3. 101; 最后= 101
  4. 100; 最后= 100
  5. 101; 最后= 101
  6. 100; 最后= 100
  7. 101; 最后= 101
  8. 100; 最后= 100
  9. 101; 最后= 101
  10. 100; 最后= 100
  11. 99; 最后= 99
  12. 98; 最后= 98

问题是,在很短的时间内,我的“真实价格”从 100 变为 101 并返回太多次。真实价格的每一次变化都意味着很多工作(重新计算、下订单等),所以我不需要像那样改变真实价格。此更改 (100-101-100-101) 是由于“测量问题”造成的,我需要对其进行过滤。我无法修复“测量”,所以我必须在这里修复它。

其中一种方法是使用“3LastAverage”算法:

  1. 98; 3lastAverage = 98
  2. 100; 3lastAverage = 99
  3. 101; 3lastAverage = 99.67 => 100
  4. 100; 3lastAverage = 100.33 => 100
  5. 101; 3lastAverage = 101
  6. 100; 3lastAverage = 100
  7. 101; 3lastAverage = …

algorithm hft

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

我如何决定是否应该使用指针或常规变量?

在c ++中,我可以将一个字段声明为某种类型的常规变量,在构造函数中实例化它,并在以后使用它:

private:    Foo field;
...

A::A() {
    // upd: likely i instatiate field wrong ways (see comments)
    field = FieldImpl();
}
....
method(field);
Run Code Online (Sandbox Code Playgroud)

或者我可以使用指针:

private:    Foo* field;
...

A::A() {
    field = new FieldImpl();
}

A::~A() {
    delete field;
}

...
method(*field);
Run Code Online (Sandbox Code Playgroud)

声明字段时,如何判断是否应使用指针或常规变量?

c++

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

将char*复制到指定pos处的std :: string,而不是分配新对象

让我用代码问我的问题:

char* apples = "apples";
std::string str("I like .....");
// need to copy apples to str to have "I like apples", without creating new objects
Run Code Online (Sandbox Code Playgroud)

分配功能,但遗憾的是似乎无法提供std::string offset.

我不想分配新对象,因为这是低延迟并且经常是代码的一部分.

UPD错,我已经把上述5点,但我的意思是6点,以适应"苹果"完美:)当然,如果串能力没有足够多的某些对象被创建.在我的问题中,我认为字符串容量就足够了.

c++ string

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

如何避免对象分配?如何重用对象而不是分配它们?

我的金融软件不断处理几乎相同的对象.例如我在线有这样的数据:

HP 100 1
HP 100 2
HP 100.1 1
etc.
Run Code Online (Sandbox Code Playgroud)

我每秒钟大约有1000次更新.

每个更新都存储在对象中 - 但我不想动态分配这些对象以改善延迟.我只在很短的时间内使用物品 - 我收听它们,申请和免费.一旦对象空闲,它实际上可以重用于另一个数据包.

所以我需要一些存储(可能是环形缓冲区),它可以分配一次所需数量的对象,它们可以"获取"并"释放"它们.在c#中这样做的最佳方法是什么?

每个对象都有id,我id's按顺序分配并释放它们sequentially.例如我收到的ID 1 23,然后我自由1,2,3.所以任何FIFO集合都可以工作,但我正在寻找一些涵盖所需功能的库类.

即我需要FIFO集合,它不分配对象,但重用它们并允许重新配置它们.

UPD

我添加了我想要的实现.这不是经过测试的代码,可能有错误.想法很简单.作家应该调用Obtain Commit方法.读者应该调用TryGet方法.读者和编写者可以从不同的线程访问此结构:

public sealed class ArrayPool<T> where T : class
{
    readonly T[] array;
    private readonly uint MASK;

    private volatile uint curWriteNum;
    private volatile uint curReadNum;

    public ArrayPool(uint length = 1024) // length must be power of 2 …
Run Code Online (Sandbox Code Playgroud)

c# memory-management

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

在整个程序中简单地输入typedef原始类型?

我正在使用long而不是decimal出于性能原因.

我想区分long哪种方式long来自long何种方式decimal.所以我想申报类似的东西using myDecimal = System.Int64;.但是这种声明只在它声明的文件中可见.我需要一些可以在整个程序中使用的东西.

这里这里建议创建"包装"类,但它看起来很尴尬!我想我最好复制粘贴using myDecimal = System.Int64;到我正在使用的每个文件.

我是否正确,我没有比这两个选项更好的东西?

为什么我不想只使用long?因为可读性!只是比较

public class FutTradeEntry
{
    public long orderId;
    public int status;
    public int amount;
    public int amount_rest;
    public sbyte action;
    public myDecimal price;
    public myDecimal deal_price;
    public int ext_id;
}
Run Code Online (Sandbox Code Playgroud)

public class FutTradeEntry
{
    public long orderId;
    public int status;
    public int amount;
    public int amount_rest;
    public sbyte …
Run Code Online (Sandbox Code Playgroud)

c#

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

std :: unordered_map - 如何随时"跟踪"最大/最小键

我有std::unordered_map<int, int>.我不想使用树或其他任何其他结构导致延迟要求.但是在任何时候我都需要知道当前的最大键和最小键.我怎样才能做到这一点?分布不均匀,而是经常删除和插入max和min.因此,我需要比"只删除当前最大/最小值时扫描整个地图以获得新的最大值/分钟"更聪明的东西.

我不想使用任何其他结构.我想用std::unordered_map!

UPD根据答案创建这样的结构:

struct OrderBookItem {
    int64_t price;
    int32_t lots;
};

typedef multi_index_container
    <OrderBookItem, indexed_by<

    hashed_unique<
    BOOST_MULTI_INDEX_MEMBER(OrderBookItem,int64_t,price)
    >,

    ordered_unique<
    BOOST_MULTI_INDEX_MEMBER(OrderBookItem,int64_t,price),
    std::greater<int64_t>
    >

    >> OrderBookContainer;
Run Code Online (Sandbox Code Playgroud)

c++ boost unordered-map boost-multi-index c++11

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

c++11 等效于 c# Interlocked.Increment

我正在将此 c# 代码重写为 c++:

public class LightOrder
{
    private static int internalIdCounter;

    public int InternalId { get; private set; }

    // i control myself to call this method exactly once for each order
    public void AssignInternalId(int ordersExecutorId)
    {
        // if InternalId is already assigned, i.e. != 0, i can print error or something
        InternalId = Interlocked.Increment(ref internalIdCounter);
        // more
    }

    // more
}
Run Code Online (Sandbox Code Playgroud)

这工作正常 - 即使AssignInternalId从不同的线程并行调用,每个订单也具有顺序 ID 。

与此代码最接近的 C++ 等效项是什么?我应该声明InternalIdstd::atomic<int>然后使用++吗?或者我应该声明InternalId …

c++ multithreading

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

c ++类似c#"是"关键字

我正在将这个c#代码重写为c ++:

foreach (var index in indexes)
{
    if (index is MaWorker)
    {
        (index as MaWorker).needCalculate = true;
    }
    if (index is RocWorker)
    {
        (index as RocWorker).needCalculate = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

什么是最好的c ++模拟?我应该使用什么而不是C#is关键字?

c++

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

如何用NULL填充指针数组?

我有一些指针:

private:
    LimitOrder* orders[Size];
Run Code Online (Sandbox Code Playgroud)

在构造函数中,我试图用NULL填充它:

InternalIdAssigner::InternalIdAssigner(void):
    lastCleanId(0)
{
    std::fill(orders, orders + Size, NULL);
Run Code Online (Sandbox Code Playgroud)

但这不起作用,我收到错误: error C2440: '=' : cannot convert from 'const int' to 'LimitOrder *'

用NULL填充数组字段的正确方法是什么?

c++ arrays

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