C++类容器get()成员函数直接调用与复制返回值优劣对比
两种配置取值方案对比分析
首先明确前提:你当前实现的config::get_name()是值返回,每次调用都会触发std::vector<std::string>的全量深拷贝,这是两种方案性能差异的核心原因。
以下从三个维度具体对比:
1. 代码开发规范维度
方案2(先拷贝到本地变量再使用)更优:
- 语义更清晰:本地变量
name明确对应当前上下文使用的配置快照,后续逻辑直接操作该变量可读性更高 - 可维护性更强:如果后续需要统一调整取值逻辑(比如新增前置校验、过滤规则),只需要修改本地变量赋值的一处即可,不需要修改所有取值位置
- 稳定性更高:不会因为
config对象后续意外修改内部存储的配置值,导致同一段逻辑前后取到的值不一致,避免隐式BUG
2. 执行耗时维度
方案2更优:
- 方案1每调用一次
get_name()就要做一次全量容器拷贝,容器内每个字符串也需要做深拷贝,调用次数越多,额外耗时越高,当配置的名称列表规模较大时,开销会非常明显 - 方案2仅触发一次拷贝,后续所有操作都在本地变量上执行,没有额外的函数调用和拷贝开销
优化建议:如果你的
config类设计为加载后配置只读,可以将get_name()的返回值修改为const std::vector<std::string>&常量引用,此时两种方案的调用耗时基本一致。
3. 内存占用维度
- 单一场景取值时两者内存占用基本持平:方案1生成的临时拷贝用完即销毁,方案2的本地变量在作用域结束后销毁,峰值内存都为两份vector的大小(
config内部存储一份+临时/本地拷贝一份) - 多位置重复取值时方案2内存占用更低:方案1调用N次会生成N个临时拷贝,即使用完就销毁,运行过程中的峰值内存更高,同时频繁的内存申请释放还会带来内存碎片问题
最终建议
优先选择方案2实现。如果确认配置加载后不会修改,可以先修改get_name()返回常量引用,进一步降低不必要的拷贝开销,只读场景下也可以直接调用get_name()取值。
内容的提问来源于stack exchange,提问作者ABHINAV RANA
相关产品推荐
相关产品推荐

