就地构造(placement new)与移动构造(std::move)
1.就地构造通常与 union 关键字一并使用,因为union会进行延迟构造并且预先开辟空的内存空间,因此这样的组合任务是较佳实现。
例子:
class FixedValueMessage { /* 定值数据 */ public: explicit FixedValueMessage(const EthernetDataFrame ðernetDataFrame) : ethernetDataFrame({ethernetDataFrame}) { if (ethernetDataFrame.getAPPIDType() != APPIDType::Type::fixedValue_send) { throw std::runtime_error( "Constructor illegally, EthernetDataFrame type is " + ethernetDataFrame.getAPPIDTypeString() + "."); } auto data = ethernetDataFrame.getAPDU(); if (data.empty()) { throw std::runtime_error("Constructor illegally, EthernetDataFrame data is empty."); } /* 分别构造8个通道的 零漂值 和 线性值 */ ptrdiff_t offset = 0l; new(&channel1) Channel{data.cbegin(), data.cbegin() + Channel::getSizeInBytes()}; offset += Channel::getSizeInBytes(); new(&channel2) Channel{data.cbegin() + offset, data.cbegin() + offset + Channel::getSizeInBytes()}; offset += Channel::getSizeInBytes(); new(&channel3) Channel{data.cbegin() + offset, data.cbegin() + offset + Channel::getSizeInBytes()}; offset += Channel::getSizeInBytes(); new(&channel4) Channel{data.cbegin() + offset, data.cbegin() + offset + Channel::getSizeInBytes()}; offset += Channel::getSizeInBytes(); new(&channel5) Channel{data.cbegin() + offset, data.cbegin() + offset + Channel::getSizeInBytes()}; offset += Channel::getSizeInBytes(); new(&channel6) Channel{data.cbegin() + offset, data.cbegin() + offset + Channel::getSizeInBytes()}; offset += Channel::getSizeInBytes(); new(&channel7) Channel{data.cbegin() + offset, data.cbegin() + offset + Channel::getSizeInBytes()}; offset += Channel::getSizeInBytes(); new(&channel8) Channel{data.cbegin() + offset, data.cbegin() + offset + Channel::getSizeInBytes()}; offset += Channel::getSizeInBytes(); /* 拷贝采样频率 */ std::copy(data.cbegin() + offset, data.cbegin() + offset + ARR_SIZE(samplingFrequency), samplingFrequency); } ~FixedValueMessage() = default; friend class EthernetDataFrame; private: union { Channel channel1; /* 通道1 */ }; uint8_t samplingFrequency[2]{}; /* 采样频率 */ EthernetDataFrame ethernetDataFrame; /* 原始帧 */ };
2. std::move通常应当在尚未申请空间时使用,本质是一种资源所有权的转移,从而避免申请空间的昂贵开销。
分类:
C++ / C++11
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2021-02-08 Codeforces Round #700 (Div. 2) B. The Great Hero