Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C结构中的松弛字节_C_Struct - Fatal编程技术网

C结构中的松弛字节

C结构中的松弛字节,c,struct,C,Struct,我知道单词边界的概念,即计算机使用单词边界存储结构。我使用的是64位CPU和64位操作系统。limits.h中的_WORDSIZE宏的值为64。所以我的字边界是8字节,对吗 我有两种结构: struct a { int a; char b; float c; }; sizeof(结构a)给出12作为答案。sizeof(int)是4。sizeof(float)是4 sizeof(结构b)是4 这些输出表明单词边界为4字节。我如何找到单词边界。那么它真的等于sizeof(int)吗 奇怪的是: s

我知道单词边界的概念,即计算机使用单词边界存储结构。我使用的是64位CPU和64位操作系统。limits.h中的_WORDSIZE宏的值为64。所以我的字边界是8字节,对吗

我有两种结构:

struct a
{
int a;
char b;
float c;
};
sizeof(结构a)给出12作为答案。sizeof(int)是4。sizeof(float)是4

sizeof(结构b)是4

这些输出表明单词边界为4字节。我如何找到单词边界。那么它真的等于sizeof(int)吗

奇怪的是:

struct c{
char a;
char b;
char c;
char d;
char e;
}

sizeof(struct c)是5个字节。有人能解释一下吗。

结构a
中,您有一个4字节的整数、1字节的字符、3字节的填充来将
浮点
与4字节边界对齐,4字节用于
浮点
。在某些计算机和某些结构上,在
char
和后面的
double
之间可能有多达7个字节的填充,如
struct f

struct f
{
    char   a;
    double b;
};
在我能想到的任何情况下,
struct b
都没有任何可选的尺寸

使用
struct c
,编译器可以在没有任何填充的情况下放置连续的元素,因为结构中的元素都不需要更严格的对齐。如果你有:

struct d
{
    short a;
    char  b;
    char  c;
    char  d;
};
预计大小为6(如果不是8)是合理的,因为
short
需要在2字节边界上对齐

struct e
{
    int   a;
    char  b;
};
在许多平台上,
sizeof(struct e)
将是8,因为结构必须是4字节对齐的


\uuuuWordSize
与此几乎没有任何关系。它不是一个标准化的宏。

首先,
\uuuWordSize
不是供您检查的。除非专门为您的使用记录了宏(或其他名称),否则不应使用以
\uuu
\u
开头的宏(或其他名称)和大写字母。它是Header使用的实现的内部部分,该实现可以在更高版本中自由删除或重命名它。其他系统甚至可能根本没有相应的宏,或者可能使用不同的名称

话虽如此,结构对齐与本机“单词”大小无关。它与结构中各个元素的对齐有关

见我对这个问题的回答:


不,
sizeof int
不必是本机单词大小,正如您所看到的-许多64位系统将
int
保留为32位以节省空间。不过,指针通常是这样的。@delnan:Yes指针在我的系统上是8字节
struct e
{
    int   a;
    char  b;
};