将非易失性变量的地址传递给易失性对象指针

问题描述 投票:0回答:1

假设我有以下功能:

void atomic_add(volatile unsigned * loc, unsigned incr );

我想将一个变量传递给这个函数的第一个参数。

unsigned a;
atomic_add(&a, 1);

volatile unsigned b;
atomic_add(&b, 1);

易失性类型限定符,它应该可以被编译。
Q1: 两者得到的结果相同吗?
Q2:

mmap()
返回的指针也可以用作该函数的第一个参数吗?
谢谢!

c atomic volatile
1个回答
1
投票

指向 易失性变量的易失性指针和指向易失性变量的区别 非易失性变量

  1. 首先

    loc
    不是
    volatile pointer
    。它是一个引用
    volatile object

    的指针
  2. 您可以将

    volatile
    而不是
    volatile
    传递给此函数,在函数中,您的对象将被视为
    volatile
    。这意味着它将在每次使用之前被读取,并在每次更改后保存到其存储中。它不会在寄存器中“缓冲”。即使您
    *loc + *loc
    引用的对象也会被读取两次。

要拥有一个易失性指针,您需要以不同的方式声明它:

unsigned * volatile loc; // volatile pointer to not volatile unsigned int object
volatile unsigned * volatile loc; // volatile pointer to volatile unsigned int object
volatile unsigned * loc; // non volatile pointer to volatile unsigned int object

Q1 - 是的

Q2 - 是的

© www.soinside.com 2019 - 2024. All rights reserved.