C对象的存储布局

C对象的存储布局,c,language-lawyer,function-parameter,memory-layout,C,Language Lawyer,Function Parameter,Memory Layout,C对象的存储布局大多没有定义。据我所知,仅针对struct成员和数组元素定义了布局 有趣的是,对于功能参数,C11标准明确提到布局未定义: 未指定参数存储的布局。(C11§6.9.1第9页) 我想知道该标准是否也明确定义了其他对象,例如具有自动存储持续时间的对象,布局是未定义的。有人知道吗?我在《标准》里找不到关于这方面的任何东西 关于具有内部或外部链接的对象呢?不,我认为没有明确提到我们对相对对象布局一无所知这一事实。事实上,C标准甚至比这更激进,甚至不允许您与进行比较,因为您混淆了不同存储类

C对象的存储布局大多没有定义。据我所知,仅针对
struct
成员和数组元素定义了布局

有趣的是,对于功能参数,C11标准明确提到布局未定义:

未指定参数存储的布局。(C11§6.9.1第9页)

我想知道该标准是否也明确定义了其他对象,例如具有自动存储持续时间的对象,布局是未定义的。有人知道吗?我在《标准》里找不到关于这方面的任何东西


关于具有内部或外部链接的对象呢?

不,我认为没有明确提到我们对相对对象布局一无所知这一事实。事实上,C标准甚至比这更激进,甚至不允许您与
进行比较,因为您混淆了不同存储类的存储和不同类型的存储布局。前者没有定义,只定义了生存期。更有趣的是,该语句似乎是标准中“布局”一词的唯一实例,所以我甚至不确定这里所说的是什么。许多体系结构都有ABI,其中第一个函数参数在寄存器中传递。但是,仍然允许获取函数参数的地址。为了避免不必要的开销,编译器可以进行各种优化,比如以某种随机顺序将寄存器复制到堆栈中(甚至可能不同于一次调用到下一次调用)。我确实相信,这项研究的目的是明确指出,这种方法是可以预期和允许的;函数参数的地址本质上是不可预测的。请参阅my,以了解相关问题。ITYM甚至不允许与
@SteveSummit进行比较:该标准明确指出,可以将对象的地址转换为字符指针,并使用该指针访问其中的字节。由于该标准对术语“对象”的使用粗疏且不一致,它不能将指针描述为标识字符数组对象(若在创建父对象时创建了字符数组对象,则对该对象的非字符部分的任何访问也将使用非字符类型访问字符数组对象,从而通过6.5p7调用ub,但该标准未能提供……对象生命周期的任何其他描述).我不认为标准的作者担心这些事情,因为他们希望编译器编写者能够认识到在显而易见的情况下,高质量的实现应该如何运行,而不管标准是否强制要求这样的行为。