- 主题:现代C++中,比较大的结构体一般怎么使用容器?
我在vc 2022上,选择c++20, emplace_back 不接受初始化列表。 只能:
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)
);
我的理解,使用初始化列表,是在调用emplace_back之前,就使用隐式转换构建对象,然后必然发生移动和拷贝。
而emplace就是为了避免这个,所以它直接接受一个可变长的参数列表,在内部构建对象,不发生移动和拷贝。
这时性能差异就明显了。
【 在 gfkid 的大作中提到: 】
: gpt4认为这个性能差异微不足道。
: 对于您的 `TradeRecord` 结构体,使用具名初始化和使用参数列表初始化的性能应该是非常接近的,因为在这两种情况下,涉及的操作基本相同。
: 1. **具名初始化**:
: ...................
--
FROM 223.72.40.*
继续用 std::vector<TradeRecord *>
【 在 finlab 的大作中提到: 】
: 比如下面这样的:
: struct TradeRecord
: {
: ...................
--
FROM 218.76.62.*
有
一般情况下,现代c++引入的完美转发就是干这个的
对vector来说,emplace系列方法即可
【 在 finlab 的大作中提到: 】
: 有办法直接在vector上创建新对象吗?
: 外面创建的对象,放入vector的时候,总要发生一次拷贝。
: 另外这种很多简单字段的结构体,move语义对它也没啥用。
: ...................
--
FROM 221.218.208.*
移动构造不用delete吧
【 在 finlab 的大作中提到: 】
: 加上这句:m_records.emplace_back(0, 0, .0, 0, .0, .0, Capital );
: 编译报错:“TradeRecord::TradeRecord(TradeRecord &&)”: 尝试引用已删除的函数
:
: ...................
--
FROM 124.64.16.*
对于都是简单数据字段的结构,移动跟拷贝没啥区别,反而更麻烦
我试了,没有移动构造,emplace_back编译不过,但是我提供了,它也没有调用。
倒是push_back先构造,再移动,再复制,感觉开销很大
而emplace 只调用构造。
【 在 gfkid 的大作中提到: 】
: 移动构造不用delete吧
--
FROM 223.72.40.*
c++是多范式的,模板只是范式之一,没见过哪家主推模板。相反,要小心滥用模板
【 在 finlab 的大作中提到: 】
: 现在C++主推模板元编程,就是见不得指针啊
: 用指针了,拷贝移动就都不用了,省事很多。
: C++委员会该做的,是怎么提高堆内存管理的效率,再提供个可选的gc, 而不是全部用值语义来避免指针。
: ...................
--
FROM 124.126.2.*
悬空太坑了
用map吧
【 在 Bernstein (Berns) 的大作中提到: 】
: 你那指针总要分配内存的吧,现在放vector里就不用分配内存了,其他的地方用到的话,用指针指向vector内部即可(有悬挂指针的可能)
:
: 【 在 finlab 的大作中提到: 】
: : 比如下面这样的:
--
FROM 175.11.211.*
vector<unique_ptr<TradeRecord>>
【 在 finlab 的大作中提到: 】
: 比如下面这样的:
: struct TradeRecord
: {
: ...................
--
FROM 99.227.59.*
支持这个
不知道LZ贴的是真实业务代码还是伪代码,如果真实代码毫无疑问直接用值更快
【 在 yuanmo 的大作中提到: 】
: 你这才几个字节,100都不到,没1K字节别说自己大。
: 现代CPU处理能力高得很,你这点开销跟白送一样。用指针反而多搞出一次引用,搞不好更影响性能。
: 花功夫前先profile一下,确定这个是不是瓶颈,再说怎么优化。
: ...................
--
FROM 222.131.8.64
现代C++不提倡直接使用裸指针
但是极力推荐使用智能指针的,也就是每个指针(资源)要保持有owner
【 在 finlab 的大作中提到: 】
: 比如下面这样的:
: struct TradeRecord
: {
: ...................
--
FROM 61.48.130.*