不稳定的功能

Volatile function

本文关键字:功能 不稳定      更新时间:2023-10-16

摘要:关键字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也可以工作,但llvm IR在我看来更可读)编译时,我得到:

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;
};

基本上,您不能在volatile(分别为const)类型的实例上调用非volatile(或者非const)函数:

struct test {
   void vfunction() volatile;
   void function();
};
volatile test t;
t.vfunction();      // ok
t.function();       // error

foo()不易失性

这是一个返回volatile int的函数

这是合法的。但是对于返回的int来说很奇怪。

另一方面,成员函数可以是volatile,原因与它们可以是const相同——它们都描述了this所指向的对象。