Энергозависимая функция

Резюме: Что означает ключевое слово 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 делает в этом случае на этих двух языках).

14

Решение

В вашем коде 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
21

Другие решения

foo() не летуч.

Это функция, которая возвращает volatile int,

Что законно. Но странно для возвращенного int,

Функции-члены, с другой стороны, могут быть volatile по той же причине они могут быть const — оба описывают объект this указывает на.

5

По вопросам рекламы [email protected]