在大多数情况下double,decimal64位系统上的类型更新是原子操作,因为这些类型是64位.(十进制是128位,所以这是错误的,感谢您的评论)
但是当我更新double?并decimal?输入64位系统时它会是原子的吗?什么是大小double?和decimal?
我知道原子性并不能保证,尽管我仍然感兴趣,如果这种更新在一般情况下是原子的.
我有“在线”系列整数,所以每隔几毫秒我就有一个新数字。频率未指定 - 有时我有很多数字,有时我没有数字。
实际上,这些数字就是所谓的股票“真实价格”。我在我的交易应用程序中使用它。
现在我只使用最后一个数字作为“真实价格”,所以我根本不跟踪系列。但是这种方法存在一些问题。我们来看看这个系列:
问题是,在很短的时间内,我的“真实价格”从 100 变为 101 并返回太多次。真实价格的每一次变化都意味着很多工作(重新计算、下订单等),所以我不需要像那样改变真实价格。此更改 (100-101-100-101) 是由于“测量问题”造成的,我需要对其进行过滤。我无法修复“测量”,所以我必须在这里修复它。
其中一种方法是使用“3LastAverage”算法:
在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)
声明字段时,如何判断是否应使用指针或常规变量?
让我用代码问我的问题:
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点,以适应"苹果"完美:)当然,如果串能力没有足够多的某些对象被创建.在我的问题中,我认为字符串容量就足够了.
我的金融软件不断处理几乎相同的对象.例如我在线有这样的数据:
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 2和3,然后我自由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) 我正在使用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) 我有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# 代码重写为 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++ 等效项是什么?我应该声明InternalId为std::atomic<int>然后使用++吗?或者我应该声明InternalId …
我正在将这个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关键字?
我有一些指针:
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填充数组字段的正确方法是什么?