【问题标题】:How can an auto variable be volatile?一个自动变量怎么可能是易变的?
【发布时间】:2014-07-25 11:16:27
【问题描述】:

我知道在文件范围内定义的 volatile 变量。不允许编译器对这些变量做出假设。它们几乎可以随时更改,并且编译不能优化对变量的读取。

现在我找到了这段代码

BOOL InstallHandler()
{
    volatile BOOL b_bulk_erase = FALSE;
    volatile BOOL b_test_read_write = FALSE;
    volatile BOOL b_continue = TRUE;
    ...
    if (b_test_read_write)
    {
        read();
        write();
    }
}

volatile 如何对应堆栈中的变量,即由一个线程拥有?

编辑:

由一个线程拥有,我想表示该变量未公开。该地址没有提供给其他任何东西。它不被任何其他线程使用。

【问题讨论】:

标签: c


【解决方案1】:

好的,我意识到了 volatile 的意图。

该函数是与硬件设备通信的设备驱动程序的一部分。正常操作期间不使用函数readwrite

但是当开发人员在调试器中运行程序时,她可以在if 子句处设置断点并使用调试器更改变量。这将允许操纵执行并调用readwrite

volatile 禁止优化,因为if 子句测试 const 表达式。如果没有volatile,整个if 可能不会出现在代码中。

【讨论】:

    【解决方案2】:

    仅仅是因为,虽然变量本身位于单个线程中,但没有什么能阻止您将其地址提供给其他线程。因此发生了不可预见的修改。

    【讨论】:

    • 虽然如果变量从来不是& 操作符的参数,编译器应该能够判断这不可能发生。
    • @Barmar 我不确定我是否理解您的评论。非易失性是所有时间的默认设置。编译器是否应将地址被视为易失性的每个变量处理,性能缺陷将是可怕的。并且没有必要。 volatile 是在这里告诉编译器“嘿,请不要疯狂优化这个变量,我打算在你背后修改它”。
    • 如果你从不取变量的地址,你怎么能把它的地址给另一个线程呢?
    • 我并不是说所有地址被占用的变量都应该被认为是易失的。我的意思是,如果地址没有被占用,它就不会是易变的。
    • @Barmar 你没有任何意义。问题是关于为什么本地可能被宣布为 volatile ......这个答案是,如果它的地址被占用,这很重要。如果它的地址没有被占用,编译器可以告诉什么是无关紧要的。正如上面的 cmets 所述,即使他们的地址没有被占用,不稳定的本地人还有其他原因。
    猜你喜欢
    • 2013-03-06
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 2021-09-28
    相关资源
    最近更新 更多