C++ 常量正确性与短内联函数有关吗?
我已经编写了两个简短的测试,并在Arch Linux上使用g++-S gcc版本4.7编译了这两个测试: test1.cpp 内联int函数int a,int b{ 返回a+b; } int main{ int c=func5,5; 返回0; } test2.cpp 内联int函数常量int&a、常量int&b{ 返回a+b; } int main{ int c=func5,5; 返回0; } 差异测试1.s测试2.sC++ 常量正确性与短内联函数有关吗?,c++,inline,const-correctness,C++,Inline,Const Correctness,我已经编写了两个简短的测试,并在Arch Linux上使用g++-S gcc版本4.7编译了这两个测试: test1.cpp 内联int函数int a,int b{ 返回a+b; } int main{ int c=func5,5; 返回0; } test2.cpp 内联int函数常量int&a、常量int&b{ 返回a+b; } int main{ int c=func5,5; 返回0; } 差异测试1.s测试2.s 1,5c1,5 < .file "test1.cpp" <
1,5c1,5
< .file "test1.cpp"
< .section .text._Z4funcii,"axG",@progbits,_Z4funcii,comdat
< .weak _Z4funcii
< .type _Z4funcii, @function
< _Z4funcii:
---
> .file "test2.cpp"
> .section .text._Z4funcRKiS0_,"axG",@progbits,_Z4funcRKiS0_,comdat
> .weak _Z4funcRKiS0_
> .type _Z4funcRKiS0_, @function
> _Z4funcRKiS0_:
12a13,14
> movl 8(%ebp), %eax
> movl (%eax), %edx
14c16
< movl 8(%ebp), %edx
---
> movl (%eax), %eax
22c24
< .size _Z4funcii, .-_Z4funcii
---
> .size _Z4funcRKiS0_, .-_Z4funcRKiS0_
36,38c38,44
< movl $5, 4(%esp)
< movl $5, (%esp)
< call _Z4funcii
---
> movl $5, 20(%esp)
> movl $5, 24(%esp)
> leal 20(%esp), %eax
> movl %eax, 4(%esp)
> leal 24(%esp), %eax
> movl %eax, (%esp)
> call _Z4funcRKiS0_
然而,我真的不知道如何解释结果。我所看到的是test2显然生成了更长的代码,但我真的不知道有什么区别
接下来的一个问题是:这与成员函数有关系吗?这些函数是不等价的,一个通过值获取参数,另一个通过引用获取参数。请注意,如果删除引用,那么剩下的函数将完全相同,只是其中一个函数强制您不更改复制参数的值,而另一个函数则不更改复制参数的值。常量正确性是针对人的,而不是针对代码生成的 它通过对可以更改的内容引入约束,使人类更容易理解代码 因此,是的,它对短函数也很重要,因为它们可以从不那么短的代码中调用,并且不容易一眼就完全理解 也就是说,您的示例函数不能说明常量的正确性
因此,虽然这回答了字面上的问题,但您可能误解了const corrective的含义,并打算问一些其他问题,如果您问这两个程序在功能上是否等效,我将避免猜测——是的。如果您询问哪个程序生成的代码最短、最快、最好,不管是什么代码,请在比较之前用-O4编译它们。我希望你们会发现他们生产的是相同的组件。事实上。。。生成的代码与-O4相同。。。我现在觉得自己很愚蠢,但如果它们是内联的,并且无论如何都不更改值,编译器不应该将它们优化为相同的指令吗?从逻辑上讲,它们做的是相同的事情。优化器应该做的事情很少像优化器实际做的事情那样有趣。@Asmageddon:我确信,如果您在启用优化的情况下编译,它们将生成相同的代码。请记住,inline关键字是编译器提示。编译器会在一天结束时做任何它想做的事情,这是一件好事。这取决于你。常量正确性通常是一件好事,但在这种情况下,我会说通过值传递一对int是微不足道的。每个人都有自己的指导方针。