从汇编的角度来看 static 和 volatile 关键字

k1r*_*1t0 1 c assembly static gcc volatile

我知道有很多这样的问题,但是这个问题不是关于从C标准的角度来看staticand意味着什么。volatile我对装配级别较低的情况感兴趣。

static变量的关键字使这些变量静态可见(静态存储持续时间),就像全局变量一样。为了使其成为现实,编译器应该将这些变量写入.bss节或其他地方?另外,static关键字防止变量/函数在文件外使用,它是只在编译期间发生还是有一些运行时检查?

volatile变量的关键字使这些变量从内存中读取,以确保如果其他东西(如外围设备)想要修改该变量,它将准确地看到该内存中的值。这里,“从内存中读取”到底是什么意思?使用什么内存位置?.bss.data, 或者是其他东西?

fuz*_*fuz 8

static关键字有两个含义:(a) 表示静态存储类,(b) 表示内部链接。这两种含义必须严格区分。

\n

具有静态存储类的对象意味着它在程序开始时分配并一直存在到程序结束。这通常是通过将对象放入数据段(对于初始化对象)或放入 bss 段(对于未初始化对象)来实现的。详细信息可能会有所不同,具体取决于相关工具链。

\n

具有内部链接的标识符意味着同一翻译单元中具有相同名称和某种链接(即链接不是 \xe2\x80\x9cnone\xe2\x80\x9d)的每个标识符都引用与该标识符相同的对象。这通常是通过不将标识符对应的符号设为全局符号来实现的。然后,链接器将不会将来自不同翻译单元的同一符号的引用识别为引用同一符号。

\n

volatile关键字指示在抽象机中对 volatile 限定对象执行的所有操作都必须在生成的代码中执行。不允许编译器执行任何会丢弃对 易失性限定对象执行的任何此类操作的优化,就像通常对非易失性限定对象所做的那样。

\n

该关键字纯粹是向编译器发出的指令,用于抑制某些优化。它不影响符合此类条件的对象的存储类别。另请参阅我之前关于该主题的回答。

\n

  • @k1r1t0 例如,如果您有类似 `int i; 的代码 我 = 0; i = 1;` 编译器可能会发现语句 `i = 0;` 没有效果并可能会丢弃它。对于易失性对象不允许这样做。使用的内存类型与同一存储类别的非易失性限定变量相同。对于自动变量,通常是堆栈。 (2认同)