gpt4认为这个性能差异微不足道。
对于您的 `TradeRecord` 结构体,使用具名初始化和使用参数列表初始化的性能应该是非常接近的,因为在这两种情况下,涉及的操作基本相同。
1. **具名初始化**:
```cpp
m_records.emplace_back(TradeRecord {
.bar_id = bar,
.trade_count = c,
.trade_price = price,
.total_count = rec0.total_count + c,
.total_cost = rec0.total_cost + c * price * (1 + fee),
.profit = 0,
.cash = rec0.cash - c * price * (1 + fee),
});
```
这里,您使用了聚合初始化(具名初始化),创建了一个 `TradeRecord` 的临时对象。由于 `TradeRecord` 是一个简单的聚合类型,这种初始化是非常高效的。
2. **参数列表初始化**:
```cpp
m_records.emplace_back({
bar,
c,
price,
rec0.total_count + c,
rec0.total_cost + c * price * (1 + fee),
0,
rec0.cash - c * price * (1 + fee),
});
```
在这种情况下,您提供了一个初始化列表,它被用来直接在 `vector` 的内部构造 `TradeRecord` 对象。这也是一个高效的操作,因为它涉及的是基本数据类型的直接赋值。
### 性能比较
- 由于 `TradeRecord` 只包含基本数据类型,这两种方法都涉及到直接赋值这些类型的值。基本数据类型的赋值操作是非常高效的,所以这两种方法的性能差异应该是微不足道的。
- 两种情况下,都不涉及复杂的内存操作或资源管理,这意味着性能上几乎没有差别。
- 如果使用的是 C++17 或更高版本,具名初始化(结构化绑定)的语法更清晰,提高了代码的可读性。但从性能角度来看,两者之间的差异几乎可以忽略不计。
### 结论
对于您的场景,无论是使用具名初始化还是参数列表初始化,对于 `std::vector<TradeRecord>` 的 `emplace_back` 方法来说,性能上的差异几乎可以忽略不计。您可以根据代码可读性和个人偏好来选择使用哪种方法。
【 在 finlab 的大作中提到: 】
: 嗯,按照8字节对齐了。
: c++11后,vector提供emplace_back方法,支持就地创建,拷贝、移动都不会发生。
: 不过这个函数直接接受构造函数的参数,不接受初始化列表,不发生隐式类型转换。
: ...................
--
FROM 114.249.28.*