Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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 - Fatal编程技术网

C 为什么填充是基于数据类型的

C 为什么填充是基于数据类型的,c,C,我想知道下面这个程序的行为,因为填充是基于C编程中相邻的数据类型工作的 #include <stdio.h> struct abc{ char a1; int a2; }X; struct efg { char b1; double b2; }Y; int main() { printf("Size of X = %d\n",sizeof(X)); printf("Size of Y = %d\n",sizeof(Y)); re

我想知道下面这个程序的行为,因为填充是基于C编程中相邻的数据类型工作的

#include <stdio.h>
struct abc{
    char a1;
    int a2;
}X;
struct efg
{
    char b1;
    double b2;
}Y;
int main()
{
    printf("Size of X = %d\n",sizeof(X));
    printf("Size of Y = %d\n",sizeof(Y));
    return 0;
}
在结构abc中,填充3个字节,而在结构efg中,填充7个字节


填充就是这样设计的吗?

添加填充是为了避免成员在不需要时跨越单词边界;正如一些人在评论中所说的那样,调整。这里有一个很好的解释:

最大成员的大小对其他成员的填充有影响。通常,所有构件都与最大构件的尺寸对齐。我相信这是因为这是编译器确保所有结构成员正确对齐的最简单/最有效的方法

因此,一个有趣的细节是,如果按大小排序结构成员,首先声明最大的成员,通常可以节省空间。下面是一些代码来说明这一点(我总是发现查看实际内存转储有助于处理类似的事情,而不仅仅是大小)


这有很多微妙之处,我相信它在不同的实现上的工作方式有所不同。有关结构排序/打包的更多详细信息,请参见…

正在添加填充,以避免成员在不需要时跨越单词边界;正如一些人在评论中所说的那样,调整。这里有一个很好的解释:

最大成员的大小对其他成员的填充有影响。通常,所有构件都与最大构件的尺寸对齐。我相信这是因为这是编译器确保所有结构成员正确对齐的最简单/最有效的方法

因此,一个有趣的细节是,如果按大小排序结构成员,首先声明最大的成员,通常可以节省空间。下面是一些代码来说明这一点(我总是发现查看实际内存转储有助于处理类似的事情,而不仅仅是大小)


这有很多微妙之处,我相信它在不同的实现上的工作方式有所不同。有关结构排序/打包的更多详细信息,请参阅。

添加填充是为了对齐。也许你应该先看看这个方向。是的,填充是为了对齐,7字节对齐是不可接受的,对吗?7字节填充只用于对齐内存。
double
需要在8字节边界上对齐。在1 byte
char
之后添加7个字节的填充,以获得8的下一个倍数。添加填充是为了对齐。也许你应该先看看这个方向。是的,填充是为了对齐,7字节对齐是不可接受的,对吗?7字节填充只用于对齐内存。
double
需要在8字节边界上对齐。在1 byte
char
之后添加7个字节的填充,以获得8的下一个倍数。
root@root:~$./mem 
Size of X = 8
Size of Y = 16
#include <stdio.h>

// Inefficient ordering-- to avoid members unnecessarily crossing word
// boundaries, extra padding is inserted.
struct X {
    unsigned long a;   // 8 bytes
    unsigned char b;   // 4 bytes
    unsigned int c;    // 4 bytes
    unsigned char d;   // 4 bytes
};

// By ordering the struct this way, we use the space more
// efficiently. The last two bytes can get packed into a single word.
struct Y {
    unsigned long a;   // 8 bytes
    unsigned int c;    // 4 bytes
    unsigned char b;   // 1 byte
    unsigned char d;   // 3 bytes
};

struct X x = {.a = 1, .b = 2, .c = 3, .d = 4};
struct Y y = {.a = 1, .b = 2, .c = 3, .d = 4};

// Print out the data at some memory location, in hex
void print_mem (void *ptr, unsigned int num)
{
    int i;
    unsigned char *bptr = (unsigned char *)ptr;

    for (i = 0; i < num; ++i) {
        printf("%.2X ", bptr[i]);
    }

    printf("\n");
}

int main (void)
{
    print_mem(&x, sizeof(struct X)); // This one will be larger
    print_mem(&y, sizeof(struct Y)); // This one will be smaller
    return 0;
}
01 00 00 00 00 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 00 00 00 00 
01 00 00 00 00 00 00 00 03 00 00 00 02 04 00 00