use*_*790 6 c arrays casting volatile
伙计们,
考虑这段(令人憎恶的)一段代码:
volatile unsigned long a[1];
unsigned long T;
void main(void)
{
a[0] = 0x6675636b; /* first access of a */
T = *a;
*(((char *)a) + 3) = 0x64; /* second access of a */
T = *a;
}
Run Code Online (Sandbox Code Playgroud)
......问题:是((char *)a)波动的还是非波动的?
这引出了一个更大的问题:两个访问之间是否存在依赖关系?也就是说,人类的常识说有,但是C99标准说易变的东西不会混淆非易失性的东西 - 所以如果((char *)a)是非易失性的,那么这两个访问不会别名,并且没有依赖.
更准确地说,C99 6.7.3(第5段)内容如下:
"如果尝试通过使用具有非volatile限定类型的左值来引用使用volatile限定类型定义的对象,则行为是未定义的."
因此,当我们进行类型转换时a,volatile限定符是否适用?
就像你说的,它是“未定义的”。这意味着恶魔会从你的鼻子里出来。请尽可能坚持“定义”的行为。说明符volatile将要求编译器不要优化该值,因为它是一个“重要”且关键的值,如果由于不同的优化机制而更改,可能会导致问题。但这就是它能做的一切。
| 归档时间: |
|
| 查看次数: |
249 次 |
| 最近记录: |