gpt4 book ai didi

c++ - volatile 功能

转载 作者:IT老高 更新时间:2023-10-28 22:18:30 29 4
gpt4 key购买 nike

总结:关键字 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++ 中,您可以创建一个 member 函数 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

关于c++ - volatile 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15283223/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com