Why is volatile needed in C?

前端 未结 18 2186
攒了一身酷
攒了一身酷 2020-11-22 04:07

Why is volatile needed in C? What is it used for? What will it do?

相关标签:
18条回答
  • 2020-11-22 04:43

    volatile means the storage is likely to change at anytime and be changed but something outside the control of the user program. This means that if you reference the variable, the program should always check the physical address (ie a mapped input fifo), and not use it in a cached way.

    0 讨论(0)
  • 2020-11-22 04:44

    Another use for volatile is signal handlers. If you have code like this:

    int quit = 0;
    while (!quit)
    {
        /* very small loop which is completely visible to the compiler */
    }
    

    The compiler is allowed to notice the loop body does not touch the quit variable and convert the loop to a while (true) loop. Even if the quit variable is set on the signal handler for SIGINT and SIGTERM; the compiler has no way to know that.

    However, if the quit variable is declared volatile, the compiler is forced to load it every time, because it can be modified elsewhere. This is exactly what you want in this situation.

    0 讨论(0)
  • 2020-11-22 04:46

    In the language designed by Dennis Ritchie, every access to any object, other than automatic objects whose address had not been taken, would behave as though it computed the address of the object and then read or wrote the storage at that address. This made the language very powerful, but severely limited optimization opportunities.

    While it might have been possible to add a qualifier that would invite a compiler to assume that a particular object wouldn't be changed in weird ways, such an assumption would be appropriate for the vast majority of objects in C programs, and it would have been impractical to add a qualifier to all the objects for which such assumption would be appropriate. On the other hand, some programs need to use some objects for which such an assumption would not hold. To resolve this issue, the Standard says that compilers may assume that objects which are not declared volatile will not have their value observed or changed in ways that are outside the compiler's control, or would be outside a reasonable compiler's understanding.

    Because various platforms may have different ways in which objects could be observed or modified outside a compiler's control, it is appropriate that quality compilers for those platforms should differ in their exact handling of volatile semantics. Unfortunately, because the Standard failed to suggest that quality compilers intended for low-level programming on a platform should handle volatile in a way that will recognize any and all relevant effects of a particular read/write operation on that platform, many compilers fall short of doing so in ways that make it harder to process things like background I/O in a way which is efficient but can't be broken by compiler "optimizations".

    0 讨论(0)
  • 2020-11-22 04:48

    it does not allows compiler to automatic changing values of variables. a volatile variable is for dynamic use.

    0 讨论(0)
  • 2020-11-22 04:49

    A marginal use for volatile is the following. Say you want to compute the numerical derivative of a function f :

    double der_f(double x)
    {
        static const double h = 1e-3;
        return (f(x + h) - f(x)) / h;
    }
    

    The problem is that x+h-x is generally not equal to h due to roundoff errors. Think about it : when you substract very close numbers, you lose a lot of significant digits which can ruin the computation of the derivative (think 1.00001 - 1). A possible workaround could be

    double der_f2(double x)
    {
        static const double h = 1e-3;
        double hh = x + h - x;
        return (f(x + hh) - f(x)) / hh;
    }
    

    but depending on your platform and compiler switches, the second line of that function may be wiped out by a aggressively optimizing compiler. So you write instead

        volatile double hh = x + h;
        hh -= x;
    

    to force the compiler to read the memory location containing hh, forfeiting an eventual optimization opportunity.

    0 讨论(0)
  • 2020-11-22 04:53

    The Wiki say everything about volatile:

    • volatile (computer programming)

    And the Linux kernel's doc also make a excellent notation about volatile:

    • Why the "volatile" type class should not be used
    0 讨论(0)
提交回复
热议问题