gpt4 book ai didi

c - 与函数调用和返回相关的全局变量访问

转载 作者:行者123 更新时间:2023-11-30 15:06:06 25 4
gpt4 key购买 nike

我一直在研究这个话题,但找不到具体的权威答案。我希望非常熟悉 C 规范的人能够回答 - 即确认或反驳我的断言,最好引用规范。

断言:如果程序由多个编译单元(单独编译的源文件)组成,则编译器必须确保在调用另一单元中的函数之前或从任何函数返回之前将全局变量(如果修改)写入内存。此外,在任何函数中,必须在首次使用之前读取全局变量。此外,在调用不在同一单元中的任何函数之后,必须在使用之前读取全局变量。无论变量是否被限定为“ volatile ”,这些事情都必须是正确的,因为另一个编译单元(源文件)中的函数可以在编译器不知情的情况下访问该变量。否则,全局变量总是需要“ volatile ”——即非 volatile 全局变量将没有任何用途。

编译器能否以不同的方式对待同一编译单元中的函数和非同一编译单元中的函数?我发现的关于全局变量的“ volatile ”限定符的所有讨论都显示了同一编译单元中的所有函数。

编辑:编译器无法知道其他单元中的函数是否使用全局。因此我假设上述条件。

我发现另外两个问题包含与该主题相关的信息,但他们没有直接解决这个问题,或者提供了我认为可疑的信息:

Are global variables refreshed between function calls?

When do I need to use volatile in ISRs?

最佳答案

[..] in any function, the global must be read before its first use.

绝对不是:

static int variable;
void foo(void) {
variable = 42;
}

为什么编译器要费心生成代码来读取变量?

The compiler must assure that global variables are written to memory before any function call or before the return from a function.

不,为什么要这样做?

void bar(void) {
return;
}
void baz(void) {
variable = 42;
bar();
}

bar 是一个纯函数(对于像样的编译器来说应该是可确定的),因此在函数调用后写入内存时不会出现任何不同的行为。

不过,“从函数返回之前”的情况很棘手。但我认为如果我们也计算内联(静态)函数,一般性陈述(“必须”)是错误的。

Could the compiler treat functions in the same compilation unit differently than ones that aren't?

是的,我认为是这样:对于静态函数(其地址从未被获取),编译器确切地知道它是如何使用的,并且此信息可用于应用一些更彻底的优化。

以上所有内容均基于 C 版本的 As-If 规则,在 §5.1.2.3/6 (N1570) 中指定:

The least requirements on a conforming implementation are:

  • Accesses to volatile objects are evaluated strictly according to the rules of the abstract machine.

  • At program termination, all data written into files shall be identical to the result that execution of the program according to the abstract semantics would have produced.

  • The input and output dynamics of interactive devices shall take place as specied in 7.21.3. The intent of these requirements is that unbuffered or line-buffered output appear as soon as possible, to ensure that prompting messages actually appear prior to a program waiting for input.

This is theobservable behaviorof the program.

特别是,您可能想阅读以下“示例 1”。

关于c - 与函数调用和返回相关的全局变量访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39416426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com