当前位置: 首页 > 知识库问答 >
问题:

将易失性数组转换为非易失性数组

费承载
2023-03-14
store_array((unsigned char *) buffer);
store_array((unsigned char *) buffer + 3);

如果是,如果3被添加到数组中,强制转换会受到什么影响?谢谢你!

编辑:@cacahuete Frito链接了一个非常相似的问题:带有'volatile'数组的'memcpy((void*)dest,src,n)'安全吗?

共有1个答案

轩辕海
2023-03-14

是的,你发布的标准报价正好涵盖了你想要做的事情。通过强制转换,您将数组中的对象假装为unsigned char,而实际上它们是volatile unsigned char,因此在函数内部,您将通过一个没有volate限定符的lvalue引用volate对象。未定义的行为。

如果不能更改函数storeArray,则必须将数据从易失性数组复制到非易失性数组,然后再将其传递给函数。

关于第二个问题:指针算术很好,它将简单地将buffer转换为一个无符号字符*,然后将3加到结果指针中,指向buffer[3](但限定条件错误)。

 类似资料:
  • 在阅读了这个问题和这个(尤其是第二个答案)之后,我对volatile及其关于记忆障碍的语义感到非常困惑。 在上面的例子中,我们写入一个易失性变量,这会导致一个mitch,这反过来会将所有挂起的存储缓冲区/加载缓冲区刷新到主缓存,使其他缓存行无效。 然而,非易失性字段可以优化并存储在寄存器中,例如?那么,我们如何才能确保给定一个写入易失性变量之前的所有状态变化都是可见的呢?如果我们有1000件东西呢

  • 问题内容: 如何使数组易失?因为正如我所了解的那样,使数组易失是不安全的吗? 问题答案: 将数组声明为volatile并 不能 对其字段进行volatile访问。您是在声明引用本身是可变的,而不是元素。 换句话说,你声明 挥发性组 的元素,而不是一个 集易挥发元素 。 解决方案是在要使用整数的情况下使用。另一种方法(但有点难看)是每次您编辑字段时都将对数组的引用重写。 您可以这样做: (就像我说的

  • 我对下面的代码段有一个问题。结果可能有一个结果[0,1,0](这是用JCStress执行的测试)。那么这是怎么发生的呢?我认为数据写入(data=1)应该在Actor2(guard2=1)中写入到guard2之前执行。我说得对吗?我问,因为很多时候我读到挥发物周围的说明没有重新排序。此外,根据这一点:http://tutorials.jenkov.com/java-concurrency/vola

  • 来自C/C++,我对Java中的volatile对象行为有点困惑。 null faik,volatile意味着b引用的“book对象”应该在主内存中。编译器可能在内部实现引用作为指针,因此b指针可能位于缓存中。我的理解是,volatile是对象的限定符,而不是引用/指针的限定符。 问题是:在使用方法中,本地引用不是易失性的。这个“本地”引用会不会把底层的Book对象从主存带到缓存中,实质上使对象不

  • C11 6.7.3类型限定符,第7段规定: 这里,指针的类型为,但我关心的是当实际指向的对象是非易失性的时会发生什么,特别是编译器是否可以将从对的单个访问转换为以下形式的两个访问: 这显然会使代码不正确。因此,目标是确定是否所有这样的指向对象实际上都需要。

  • 我正在使用一个API,该API为内存映射的I/O提供指针。它通过填写指针到指针的参数来实现这一点: 因为这是内存映射的I/O,所以我很确定我应该在这里使用。(我不知道为什么他们没有将参数设为。) 但是,我的volatile void**不能隐式转换为函数的,因此我不能直接传入它: 我目前正在使用一个额外的变量和一个单独的赋值步骤来解决这个问题: 这似乎很冗长。在这种情况下,当指针传入时,将vola