强制编译C函数的时间?

时间:2013-12-24 13:42:22

标签: c gcc constants compiler-optimization

在我的微控制器项目中,我有一个更新CRC(_crc_ibutton_update来自avr-libc的功能)。 我正在实现的协议计算包的校验和,包括其初始同步字节,我想将同步字节的CRC的值保持为编译时间常数,但我不想手动预先计算它。

有没有办法强制编译器(GCC 4.3.3)在编译期间计算值并仅发出一个加载常量指令?

库中的函数只包含内联汇编程序,因此我在参数为常量时尝试使用C实现(使用__builtin_constant_p()确定)。代码只是正常编译。 CRC函数不是太复杂,只包含一个具有恒定迭代次数的for循环,一个分支和几个按位运算。

为了清楚起见,保存这八个汇编指令绝对不是关键,但找到某种解决方案对我的强迫症来说将是一个很好的圣诞礼物: - )

2 个答案:

答案 0 :(得分:1)

如果我在问题static inline中声明超链接后面的函数,那么gcc -O3会编译对单个指令的已知参数的函数调用:

~ $ cat t.c
#include <stdint.h>

static inline uint8_t
 _crc_ibutton_update(uint8_t crc, uint8_t data)
{
  uint8_t i;

  crc = crc ^ data;
  for (i = 0; i < 8; i++)
    {
      if (crc & 0x01)
    crc = (crc >> 1) ^ 0x8C;
      else
    crc >>= 1;
    }

  return crc;
}

int x;

int main()
{
  x = _crc_ibutton_update(17, 42);
}
~ $ gcc -O2 -S t.c
~ $ cat t.s
...
    movq    _x@GOTPCREL(%rip), %rax
    movl    $158, (%rax)
    popq    %rbp
    ret
...

这是“gcc版本4.2.1(基于Apple Inc. build 5658)(LLVM build 2336.11.00)”,它也适用于“gcc版本4.4.3(Ubuntu 4.4.3-4ubuntu5.1) )“(然后要求-O3)。

答案 1 :(得分:0)

有一种方法,但你必须升级到C ++ 11!

新的constexpr说明符正是您所看到的。但令人遗憾的是not supported in GCC 4.3

相关问题