Резюме: Что означает ключевое слово volatile
делать при применении к объявлению функции в C и C ++?
подробности:
Я вижу, что можно скомпилировать функцию, помеченную как volatile
, Тем не менее, я не уверен, что оптимизация компилятора (если таковые имеются) это мешает. Например, я создал следующий тестовый пример:
volatile int foo() {
return 1;
}
int main() {
int total = 0;
int i = 0;
for(i = 0; i < 100; i++) {
total += foo();
}
return total;
}
Когда я собираю с clang -emit-llvm -S -O3 test.c
(gcc также будет работать, но, по моему мнению, IRvl llvm будет более читабельным)
target triple = "x86_64-unknown-linux-gnu"
define i32 @foo() #0 {
ret i32 1
}
define i32 @main() #0 {
ret i32 100
}
Очевидно, что компилятор смог оптимизировать вызовы функций foo()
чтобы main()
возвращает константу, даже если foo()
помечен как volatile
, Так что мой вопрос volatile
делает что-либо вообще, когда применяется к объявлению функции с точки зрения ограничения оптимизации компилятора.
(Обратите внимание, мой интерес к этому вопросу в основном любопытство, чтобы понять, что volatile
делает, а не решать какую-то конкретную проблему.)
(Также я пометил этот вопрос как C и C ++ не потому, что я думаю, что это один и тот же язык, а потому, что мне интересно знать, есть ли различия в том, что volatile
делает в этом случае на этих двух языках).
В вашем коде volatile
Ключевое слово не относится к функции, но к типу возвращаемого значения эквивалентно:
typedef volatile int Type;
Type foo();
Теперь в C ++ вы можете сделать член функция volatile
так же, как const
квалификатор и поведение одинаковы:
struct test {
void vfunction() volatile;
};
По сути, вы не можете вызывать энергонезависимую (альтернативно неконстантную) функцию в энергозависимом (соответственно константном) экземпляре типа:
struct test {
void vfunction() volatile;
void function();
};
volatile test t;
t.vfunction(); // ok
t.function(); // error
foo()
не летуч.
Это функция, которая возвращает volatile int
,
Что законно. Но странно для возвращенного int
,
Функции-члены, с другой стороны, могут быть volatile
по той же причине они могут быть const
— оба описывают объект this
указывает на.