WebRTC VideoSendStreamParameters构造函数中config参数为何不通过引用传递?
这个设计是结合C++移动语义、两个参数类型的自身特性、以及所有权语义共同决定的,具体原因如下:
1. webrtc::VideoSendStream::Config 参数用值传递+std::move初始化的原因
- 从源码可见
VideoSendStream::Config只声明了移动构造函数Config(Config&&);,没有提供拷贝构造函数,说明这个类型天生禁止拷贝,只能通过移动传递所有权,你担心的「值传递引入拷贝开销」的情况根本不会发生。 - 采用值传递的写法,不需要额外重载接收左值引用、右值引用的两个版本构造函数,代码更简洁:当调用方传入右值(比如示例中调用
parameters_构造时传入的std::move(config)),参数构造阶段直接调用移动构造完成所有权转移,之后再通过std::move(config)初始化类成员,全程只有两次移动操作,对于包含大量成员的Config结构来说,移动开销远低于拷贝,几乎可以忽略。 - 这种写法也明确了Config的所有权完全转移到
VideoSendStreamParameters实例中,避免外部保留多余的Config副本意外修改,提升运行安全性。
2. VideoOptions 参数用const引用传递的原因
VideoOptions本身是存储视频编码、传输相关开关、数值参数的轻量结构,拷贝开销极低,本身也支持拷贝操作。- 用
const VideoOptions&传递只读入参,既可以明确表达「这个参数不会被修改、不会被转移所有权」的语义,也只需要在初始化类成员的时候做一次拷贝即可,完全满足需求,是轻量只读入参的标准写法。
从调用链也可以验证设计的合理性:外层WebRtcVideoSendStream构造函数接收Config时也用值传递,传入parameters_构造时直接通过std::move转移所有权,全程没有任何拷贝操作,完全符合Config不可拷贝的设计约束。
内容的提问来源于stack exchange,提问作者relent95
相关产品推荐
相关产品推荐

