【发布时间】:2012-12-07 12:21:18
【问题描述】:
对于嵌入式软件项目,我们需要使用一些const volatile TYPE * 指针。现在我们有了一些计算函数,如下所示:
uint8 calc(const volatile uint8 *array, uint8 value) { ... }
在函数执行期间,两个变量的数据都没有变化。
调用代码如下:
const volatile uint8 *array = (const volatile uint8 *)0x00010111;
uint8 value = 8;
uint8 result = calc(array, value);
现在的问题是,如果我们设计没有可变参数的计算函数,会有什么不同:
uint8 calc(const uint8 *array, uint8 value) { ... }
对于调用,我们抛弃了 volatile:
uint8 result = calc((const uint8 *)array, value);
第二种解决方案的优点是更灵活:我们也可以将该函数用于非易失性变量。但是,如果我们抛弃 volatile 并且我们的编译器进行一些强大的优化,它会有什么不同吗?
【问题讨论】:
-
可能不会有任何区别。
-
可能不会有什么不同,但是编译器可以在后台做很多事情,唯一确定的方法是查看生成的机器代码。考虑强制转换的一种方法是你告诉编译器“我比你更了解”;在这种情况下你不需要。