2017-04-19 60 views
2

长期用户,这里是第一次海报。我找了一个类似的问题,但一直无法找到任何东西。如果我在#define中使用固定公式,是否比使用数字效率低?

我正在通过KeilμVision上C语言编写的一些Cortex-M3工作代码工作。

在记录ADC值的函数中,使用比例因子将位从位转换回电压。

我的问题是围绕缩放因子,这是在头文件中定义:

#define INPUT_VALUE_MAX (uint16_t)((1<<12)-1)

因此,这等于4095,这是有道理的,因为它是一个12位ADC。我的问题是,将公式“INPUT_VALUE_MAX”的值定义为公式意味着每次使用它时,微控制器都必须重新计算该值。

简单,做:

#define INPUT_VALUE_MAX (uint16_t)((1<<12)-1)

会比更多的处理时间:

#define INPUT_VALUE_MAX (uint16_t)4095

在此先感谢任何人可以提供的帮助!

+0

根据使用的编译器,它重写第一个像优化的第二个,所以我认为它是相同的。 –

+1

(几乎?)所有的编译器都会在编译时评估常量,并在代码中粘贴'4095'。 – TripeHound

+0

太棒了!谢谢你的迅速和有益的回应! –

回答

3

不,它不需要任何运行时间处理时间。整个宏是一个整型常量表达式,这意味着它将在编译时计算。

如果看一下生成的汇编,你会看到的是,表达由恒定4095


常量表达式被C这样定义取代,C11 6.6:

在翻译过程中可以评估一个常量表达式而不是运行时,因此可以用于常数可能为 的任何地方。

约束

常量表达式不得含有赋值,递增,递减函数调用,或逗号经营者,当它们被包含未评估的子表达式中除。

每个常量表达式应评估为一个常数,该常数值在其类型的可表示值范围内。

/-/

一种整数常量表达式应具有整数型,并应 仅具有是积分常数,枚举常数, 字符常数,sizeof表达式其结果是整数操作数 常量,_Alignof表达式和浮点常量,它们是类型转换的立即操作数 。在整数常量 表达式中的演员算符只能将算术类型转换为整数类型 ,除了作为sizeof或_Alignof运算符的操作数的一部分。

+0

非常感谢您的详细解答! –

相关问题