c - 在按值传递 const 参数的情况下,是否有任何优化 yield 的真实示例?

标签 c optimization constants c99

是这样的,

我试着调查了一些实现函数的优点/缺点,如下所示:

void foo(const int a, const int b)
{
    ...
}

具有用作 API 的通用函数原型(prototype),它包含在头文件中,如下所示:

void foo(int a, int b)

我在以下问题中发现了关于此主题的大量讨论:

Similar Q

我同意 rlerallut 的回答,他说的是自文档化代码以及对代码安全性的偏执。

然而,这就是问题所在,有人在那里写道,对传递给函数的常用参数使用 const 可以带来一些优化好处。我的问题是有没有人有现实生活中的例子来证明这一说法?

最佳答案

“它可能会帮助编译器稍微优化一些东西(虽然这是一个很长的路要走)。”

我看不出它会有什么不同。在这种情况下,当您尝试修改 const 变量时生成编译器警告/错误是最有用的...

如果您尝试发明一个实验来比较声明为 const 或不声明为 const 的函数参数以进行优化,请按值传递。这意味着该实验不会修改变量,因为当使用 const 时,您会收到警告/错误。可能能够关心的优化器已经知道变量在有或没有声明的代码中没有被修改,然后可以相应地采取行动。该声明有什么关系?如果我发现这样的事情,我会将差异作为错误提交给编译器错误板。

例如,这是我在玩 const 与 not 时发现的一个错失的机会。

注意const与否并不重要...

void fun0x ( int a, int b);
void fun1x ( const int a, const int b);
int fun0 ( int a, int b )
{
    fun0x(a,b);
    return(a+b);
}
int fun1 ( const int a, const int b )
{
    fun1x(a,b);
    return(a+b);
}

用 -O2 和 -O3(和 -O1?)生成的 gcc

00000000 <fun0>:
   0:   e92d4038    push    {r3, r4, r5, lr}
   4:   e1a05000    mov r5, r0
   8:   e1a04001    mov r4, r1
   c:   ebfffffe    bl  0 <fun0x>
  10:   e0850004    add r0, r5, r4
  14:   e8bd4038    pop {r3, r4, r5, lr}
  18:   e12fff1e    bx  lr

0000001c <fun1>:
  1c:   e92d4038    push    {r3, r4, r5, lr}
  20:   e1a05000    mov r5, r0
  24:   e1a04001    mov r4, r1
  28:   ebfffffe    bl  0 <fun1x>
  2c:   e0850004    add r0, r5, r4
  30:   e8bd4038    pop {r3, r4, r5, lr}
  34:   e12fff1e    bx  lr

如果这可以用更少的周期工作......

push {r4,lr}
add r4,r0,r1
bl fun1x
mov r0,r4
pop {r4,lr}
bx lr

clang/llvm 在函数调用燃烧额外堆栈位置后执行相同的操作。

谷歌搜索显示主要是关于 const by reference 而不是 const by value 的讨论,然后是 C 和 C++ 的细微差别,例如 const 声明会或不会或可以或不能更改什么,等等。

如果您在全局变量上使用 const,那么它可以将该项目保留在 .text 中而不是在 .data 中(对于您的 STM32 微 Controller ,不必将其从闪存复制到 ram)。但这不符合你的规则。优化器可能不在乎,也可能不会真正接触到它可能知道的变量,根据指令集将其作为立即数直接编码到指令中,等等……所有的东西都保持不变,尽管非常量会有如果不声明为 volatile,同样的好处...

按照您的规则,const 会避免一些人为错误,如果您尝试将该 const 变量放在等号的左侧,编译器会通知您。

我会认为这违反了您的规则,但是如果在按值传递的函数内部,您做了一些按引用传递的事情并玩了按引用传递 const 与非优化游戏....

关于c - 在按值传递 const 参数的情况下,是否有任何优化 yield 的真实示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21868204/

相关文章:

c++ - 对需要 const 引用的函数的整数输入

java - 将运算结果赋给常量

C 神秘溢出

c 在不知道长度的情况下分配内存

android - 大型字符串数组会卡住我的程序吗?

javascript - 函数中定义的 JS 对象字面量会被优化吗?

c - 指针运算

objective-c - 在 C 中使用 Doxygen 记录变量

python - 我将如何改善/使其运行更快?

c++ - 转发模板参数的常量性,我应该使用转发引用吗?