C语言仅读校验结构体时,传值与传指针哪种开销更高
两种结构体传参的开销差异对比
当结构体尺寸较大时,直接传结构体对象的传值方式,确实比传const结构体指针的方式产生更高的内存与运行开销,这是C语言开发里非常明确的选型常识。
两种传参方式的成本差异本质
- 传值入参版本(写法为
int function(foo object))的实际开销:
调用这个函数的瞬间,程序会把传入的结构体所有字节逐字节完整拷贝到当前函数的栈帧空间里。这个拷贝动作的CPU耗时、临时占用的栈空间,是严格和结构体总尺寸成正比的:- 如果是示例里只有1个int字段的极简结构体,拷贝4/8字节的成本低到可以忽略,甚至编译器开最高优化后,两种写法生成的机器码差异小到测不出来;
- 但如果是嵌了大数组、几十上百个字段、总尺寸到KB甚至MB级的大结构体,逐字节拷贝的耗时会非常明显,临时占用的栈空间也会线性涨上去,极端情况下甚至可能因为栈容量不够直接触发崩溃。
- 传const指针入参版本(写法为
int function(const foo *object))的实际开销:
调用这个函数时,不管原结构体多大,只需要把原对象的内存地址(32位环境下4字节、64位环境下8字节)压到栈上就行,完全不需要拷贝结构体的全部内容。运行时访问结构体字段时,只是通过指针指向的地址做一次间接寻址,这点寻址成本和大结构体的逐字节拷贝成本比起来,几乎可以忽略不计。
实际选型的注意点
- 别拿小结构体的特例当通用规律:如果结构体尺寸和一个指针差不多大(比如只有1-2个字长的字段、总大小和指针齐平),传值反而可能因为省掉了间接寻址的步骤有非常微弱的性能优势,但这个场景完全不适用于大结构体的通用情况。
- 传const指针的语义收益远高于微小的性能波动:加了
const修饰的入参,既可以明确告诉读代码的人“这个函数不会改动传入的结构体内容”,也能从语法层面拦住函数内部误修改原结构体的问题,代码的可维护性比传值好很多。
内容的提问来源于stack exchange,提问作者Fayeure
相关产品推荐
相关产品推荐

