问题描述
以下摘自 K&R 的 The C Programming Language(第 8.7 节)中的代码示例:
The following is an excerpt from a code sample in K&R's The C Programming Language (section 8.7):
typedef long Align;
union header {
struct {
union header *ptr;
unsigned size;
} s;
Align x;
};
typedef union header Header;
这里是解释性摘录:
为了简化对齐,所有块都是标头大小的倍数,以及标头正确对齐.这是由包含所需的标题结构和最严格的类型的实例,这是我们随意制作的.
所以,据我所知,这个想法是确保 header
实例占用的字节数是 sizeof(Align)
的倍数.这个目标对我来说很有意义.
So, as I understand it, the idea is to ensure that a header
instance takes up a number of bytes that is a multiple of sizeof(Align)
. The goal makes perfect sense to me.
但是考虑long
为64位,int
为32位,指针为64位的情况.在这种情况下,header.s
将是 64+32 = 96 位.因此,sizeof(header)
将是 96 位,这不是预期的 64 的倍数.
But consider the case where long
is 64 bits, int
is 32 bits, and a pointer is 64 bits. In that case, header.s
will be 64+32 = 96 bits. Thus, sizeof(header)
will be 96 bits, which is not a multiple of 64 as intended.
在这种情况下,我认为有必要将 Align
定义为其他东西(可能是 double
).但我不太确定我是否完全理解是什么决定了特定架构的选择.它只是最大"的类型吗?如果 long
是最大的类型怎么办 - 它不能以我上面描述的方式工作吗?
In such a case, I suppose it would be necessary to define Align
as something else (perhaps double
). But I'm not quite sure whether I'm fully understanding what would dictate that choice for a particular architecture. Is it just the "biggest" type? And what if long
is the biggest type - couldn't it fail to work in the way I described above?
谢谢
推荐答案
编译器会调整header
的大小,使得ptr
,size
> 和 x
都可以从 header[]
数组中的元素有效地检索.在大多数架构上,x
的存在意味着 sizeof(header)
将增加到 sizeof(long)
的倍数.
The compiler will adjust the size of header
so that ptr
, size
, and x
can all be retrieved efficiently from elements in a header[]
array. On most architectures, the presence of x
means that sizeof(header)
will be increased to a multiple of sizeof(long)
.
这篇关于我从这个 K&R 样本中遗漏了什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!