【问题标题】:Does gcc automatically perform a mathematical operations on const values during compilationgcc 是否在编译期间自动对 const 值执行数学运算
【发布时间】:2019-04-10 17:48:51
【问题描述】:

假设我们执行

malloc(4 * sizeof(int))

现在,数字 4 是一个常数,据我了解,sizeof 实际上是编译时函数(除非你在其中有一个变量)。

在这种情况下(考虑 x86)sizeof(int) 也是 4。我的问题是:gcc 优化会自己执行计算还是会在 asm 中生成方程?

【问题讨论】:

  • sizeof 始终是编译时的,VLA 的特殊情况除外。
  • sizeof 不是函数,顺便说一句,它是关键字。
  • @Shawn it's an operator ;) 所以有人可能会说这是一种特殊的函数。
  • 选择 一种编程语言。我在注意到这一点之前回答了。这是C还是C++。已经有一个答案在 C++ 中是正确的,而在 C 中是错误的!
  • @BranislavBrzak 是的,这个问题的答案顺便说一句在 C 和 C++ 中几乎是相同的。但这不是一个好的借口!

标签: c++ c gcc optimization


【解决方案1】:

这称为“恒定折叠”,是的,它会在组装之前发生。组装本身通常根本没有优化。

考虑最小程序

#include <stdlib.h>

int main(void)
{
    malloc(4 * sizeof(int));
}

我们可以用gcc -S把它编译成汇编。在我的电脑上,生成的程序集显示:

main:
        pushq   %rbp
        movq    %rsp, %rbp
        movl    $16, %edi
        call    malloc@PLT
        movl    $0, %eax
        popq    %rbp
        ret

即您在其中看到的唯一常量是16 (4 * sizeof(int)) 和0(来自main() 的隐式返回值)。


请注意,在 C 语言中有一类称为“整数常量表达式”的表达式,应该在编译时进行计算。您可以使用 4 * sizeof(int) 作为数组的大小 - 甚至在 _Static_assert 子句中 - 自然地,它必须在编译期间进行评估,但在一般情况下,例如这里,C标准不需要其中之一。

【讨论】:

  • 感谢您的回答。而且我知道关于汇编,如果我提出“操作将在编译时还是运行时发生”的问题会更好。
  • @BranislavBrzak 这是一个不同的问题,too 已在此处得到解答。
猜你喜欢
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多