SAY 发表于 2024-3-19 00:16:04

volatile 可以用来修饰函数返回值吗

如题,可否举一个例子

_only 发表于 2024-3-19 00:16:14

such asvolatile int volatileFun(void)

渐行渐远 发表于 2024-3-19 00:16:42

百度了一下,“volatile的变量是说这变量可能会被意想不到地改变”我个人理解是对它的访问不做优化,对内存变量才有效,应该是编译器级别的约定(又如static 的变量会被解释成全局变量)。
函数的返回值在eax中,将忽略volatile。

小例:均启用/Ox优化#include <stdio.h>volatile int myfun(int n){    n=n+2;      return rand(n);}void main(){    volatileint i=10;    //int i=10;    int a,b,c;    a=i;    b=i;    c=i;    printf("i=%d\n",a);    printf("i=%d\n",myfun(4));}片段:mov         DWORD PTR _i$, 10//imov         eax, DWORD PTR _i\$ //amov         ecx, DWORD PTR _i\$ //bmov         edx, DWORD PTR _i\$ //c四次访存,未优化。
若改为 int i=10;则有
a=i;
    b=i;
    c=i;
因未实际使用,已全被忽略。


以上对于函数返回值加与不加无影响,均为
push          eax
push         OFFSET    \$SG2233
call         _printf

总之,volatile 针对存变量,每次访存的话就不一定保存数据一致性了,且volatile会影响全局优化。
有误之处请指正,也是才接触,似乎面试中常考,解释的也很玄。

JamesTeest 发表于 2024-3-19 00:17:15

我也Google了下,结论是:volatile 可以用来修饰函数返回值。

volatile的本意是“易变的” 由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。


在linux的source code(linux/mm/memory.c)中有这样两句:volatile void do_exit(long code);static inline volatile void oom(void){    printk("out of memory\n\r");    do_exit(SIGSEGV);}volatile修饰函数是为了线程安全的考虑。

volatile 函数 是特指存在于volatile memory当中的函数吧,函数指针也是随时会变化的。

限定词volatile告诉编译器“不知道何时会改变”,防止编译器依据变量的稳定性作任何优化。当读在代码控制之外的某个值时,例如读一块通信硬件中的寄存器,将使用这个关键字。无论何时需要volatile变量的值,都能读到,即使在该行之前刚刚读过。

“在代码的控制之外”的某个存储空间的一个特殊例子是在多线程程序中。如果正在观察被另一个线程或进程修改的特殊标识符,这个标识符应该是volatile的,所以编译器不会认为它能够对标识符的多次读入进行优化。

注意当编译器不进行优化时,volatile可能不起作用,但是当开始优化代码时(当编译器开始寻找冗余的读入时),可以防止出现重大错误。

volatile的语法与const一样,但volatile的意思是“在编译器认识的范围外,这个数据可以改变”。就像建立const对象一样,程序员也可以建立volatile对象,甚至可以建立const volatile对象,这个对象不能被客户程序员改变,但可通过外部的代理程序改变。

itimowahwafli 发表于 2024-3-19 00:17:40

有人写了这样的测试例子:volatile int volatileFun(void){    printf("\n In volatileFun");    return 0;}我想其初衷就是防止该函数被优化掉了吧.
不知道编译器会对该函数具体作何种优化

111 发表于 2024-3-19 00:18:18

4# gxqcn
static inline volatile void oom(void)
这个太强悍了,https://bbs.emath.ac.cn/static/image/smiley/1/dizzy.gif

ifequwu 发表于 2024-3-19 00:19:06

很想看看 linux/mm/memory.c,但没下载到。
就是想了解下用 volatile 修饰函数返回值的目的:真是声明该函数指针可能被更改吗?

Kristslots 发表于 2024-3-19 00:19:27

7# gxqcn
是不是 允许被线程更改

igikzari 发表于 2024-3-19 00:20:05

volatile 修饰的目的是防止编译器优化,通知它是个可变的变量,主要来自其它线程的修改。
但用它来修饰 函数,我还没用过。

Charlslots 发表于 2024-3-19 00:20:26

7# gxqcn
很好搜索吧:
下载地址:
http://www.oldlinux.org/Linux.old/bochs/linux-0.11-040305.zip
源自:http://www.oldlinux.org/
页: [1]
查看完整版本: volatile 可以用来修饰函数返回值吗