相关疑难解决方法(0)

挥发功能

简介: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;
}
Run Code Online (Sandbox Code Playgroud)

当我编译时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
}
Run Code Online (Sandbox Code Playgroud)

很明显,编译器能够优化掉函数调用,foo()以便main()返回一个常量,即使foo()标记为volatile …

c c++ volatile

16
推荐指数
2
解决办法
2万
查看次数

C++ volatile关键字,具有由函数访问的全局共享变量

我有一个多线程C++应用程序.

现在我知道对于全局共享变量,在检查变量状态时应该在某些情况下使用volatile,否则编译器可能会认为变量的值永远不会改变(在该线程中).

但是,如果不是检查变量的状态而是调用返回变量值的方法,该怎么办?例如:

static int num = 0;

...

void foo()
{
   while(getNum() == 0)
   {
      // do something (or nothing)
   }
}
Run Code Online (Sandbox Code Playgroud)

我还需要将num变为volatile变量吗?或者编译器是否认识到,因为我正在使用一种方法来访问该变量num,所以它不会缓存结果?

有人有任何想法吗?

提前致谢,

〜朱利安

编辑:在我的while循环中我删除了睡眠调用并用通用的东西替换它,例如注释做某事(或什么都没有)

c++ concurrency multithreading volatile

5
推荐指数
1
解决办法
1616
查看次数

标签 统计

c++ ×2

volatile ×2

c ×1

concurrency ×1

multithreading ×1