C++中变量直接赋值与方法赋值的性能差异及数组访问方法的性能影响
数组索引封装为方法的性能影响
先说结论:绝大多数日常开发场景下,这种封装带来的性能影响完全可以忽略,具体得看你的封装逻辑和编译器优化情况:
现代编译器会帮你“消除”简单函数的调用开销
比如你的getIndex只是单纯返回数组对应下标的值,像这样:int getIndex(int x) { return _privateArray[x]; }只要开启了基本优化(比如GCC的
-O2、MSVC的/O2),编译器会自动把这个函数内联——也就是直接把函数里的代码替换到调用它的地方,和你直接写_privateArray[x]没有任何区别,不会产生额外的函数调用栈开销。只有复杂逻辑才会带来性能损耗
要是你在getIndex里加了一堆额外操作:比如日志输出、动态计算偏移量、调用其他无法内联的函数,那肯定会有性能影响。但如果只是封装单纯的索引逻辑,完全不用担心这点。别为了微乎其微的性能牺牲可维护性
比起那点几乎不存在的性能损耗,封装索引逻辑的好处要大得多:比如以后要加数组越界检查、或者修改索引规则(比如从0基改成1基),只需要修改getIndex这一个地方就行,不用在代码里所有直接用operator[]的地方挨个修改,能大幅提升代码的可维护性,减少出错概率。纠结的话就做个基准测试
要是你实在对性能有极致要求,自己写个简单的基准测试验证一下:比如循环调用1亿次直接索引和getIndex,对比两者的耗时。你会发现绝大多数情况下,两者的耗时几乎没有差异。
内容的提问来源于stack exchange,提问作者Allen
相关产品推荐
相关产品推荐

