不稳定的功能
Volatile function
摘要:关键字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
所指向的对象。
相关文章:
- Arduino Nano:A4988 使用串行输入时通过定时器进行步进控制不稳定
- 为什么我的打印功能不起作用?链表
- Cuda 基本程序 (将值写入矩阵和 std:cout 不起作用) ;主功能不启动
- 我不知道为什么复制构造函数的调用在 c++ 中不稳定
- ArUco姿态估计中的不稳定值
- 虚拟功能不起作用
- 当我使用 fstream 与 for 一起使用时值不稳定,C++
- 返回状态后,功能不会结束
- C++插入排序错误功能不起作用
- 功能不停止
- 使用链表.为什么我的插入功能不起作用?
- 不稳定的C :每行适应性变化多变量初始化
- 加入向量的所有线程后,程序不稳定,而不是退出
- 打印功能不会终止
- 为什么这个base64解码/编码功能不能正常工作?
- clEnqueueWriteImage 在执行时间上不稳定
- C 所有质数功能不起作用
- 朋友功能不起作用(语法错误)
- 为什么C 模板功能不支持返回指针
- 不稳定的功能