单个变量是否存在编译器内存障碍?

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

编译器内存屏障的作用之一是强制编译器确保缓存在寄存器中的所有堆栈变量在屏障之前写入内存。

例如GCC有如下声明:

asm inline ("" : : : "memory");

有什么方法可以告诉编译器(特别是 GCC,但我也对其他编译器感兴趣)仅对特定变量执行相同的效果?类似于以下想象的构造:

int x;
...
asm inline ("" : : : "memory(x)");

按照预期的行为,如果 x 和 x 的值恰好缓存在寄存器中,则只会将其写入相应的内存位置。

原因是我有一个特定的变量,我需要确保它没有缓存在寄存器中,以便硬件引擎可以读取它的值。然而,完整的编译器内存屏障将迫使编译器将当时可能缓存在寄存器中的“所有”其他变量的值写入内存,这可能会产生比我需要写入的更多的数据。我想知道是否有更具体的东西。 提前致谢!

c gcc
4个回答
5
投票
{ int y = x; *(volatile int*)&x = y; }

并检查生成的组件。

    


3
投票

__sync_bool_compare_and_swap(&myvar, 0, 0)

如果变量已经是
0
:),则

会将变量的值设置为

0
:),此外还意味着该内存位置上的完全顺序一致性。
    


3
投票

#define forget(x) __asm__ __volatile__("":"=m"(x):"m"(x))



1
投票
asm

的输出值列表中指定你的变量来实现它:


__asm__ __volatile__ ("" : "=r" (x) : : )

请参阅
扩展汇编

了解一些信息。 UPD。

使用

"g"

约束而不是

"r"
可能会更好,因为更宽松。

__asm__ __volatile__ ("" : "=g" (x) : : )

此外,我还找到了另一个用于内联汇编的
很棒的方法

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