Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 常量正确性与短内联函数有关吗?_C++_Inline_Const Correctness - Fatal编程技术网

C++ 常量正确性与短内联函数有关吗?

C++ 常量正确性与短内联函数有关吗?,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" <

我已经编写了两个简短的测试,并在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"
<   .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是微不足道的。每个人都有自己的指导方针。