C语言结构体大小

C语言结构体求大小

前言:

在Windows和Linux操作系统中,CPU对于数据的访问都有一定的字节对齐规则。字节对齐是指数据存储在内存中时,所占的字节数需要满足一定条件,以便提高程序的性能和可移植性。默认情况下,Windows和Linux操作系统的字节对齐大小是有所不同的。

在Windows操作系统中,结构体成员的默认字节对齐大小是8字节。这意味着,如果一个结构体成员的大小不足8字节,那么该成员会被自动填充至8字节。这个规则可以通过 #pragma pack 来改变。在某些情况下,可以通过改变字节对齐大小来减小数据占用的空间,提高程序的效率。

在Linux操作系统中,结构体成员的默认字节对齐大小是4字节。这个规则通常可以通过选项 -malign-double 或者通过 __attribute__((aligned(n)))来改变。Linux系统的字节对齐大小比Windows小,这是因为ARM架构、嵌入式系统等很多硬件都采用了较小的字节对齐以提高内存使用效率。但是也需要注意,如果字节对齐太小可能会影响程序的性能,导致数据内存对齐的不足而导致处理时间增加。

引入一个知识,我这里会写的比较少,大家可以打开自己的课本查看。

1、结构体变量的首地址,必须是结构体变量中的“最大基本数据类型成员所占字节数”的整数倍。(对齐)

2、结构体变量中的每个成员相对于结构体首地址的偏移量,都是该成员基本数据类型所占字节的整数倍。(对齐)

3、结构体变量的总大小,为结构体变量中“最大基本数据类型成员所占字节数”的整数倍(补齐)

下面是一些例子,博主带大家来计算大小┗|`O′|┛ 嗷~~ (别看俺的字丑,俺其实可温柔了)

首先是不含指针(有数组的情况下,且数组大小不为0)

//
// Created by 18751 on 2023/5/30.
//
#include

typedef struct struct1{
    int first;    //首先是int4字节
    double second;//下来的基本数据类型是double8个字节,但是这个结构体成员之前。只有四个字节,我们补足内存大小到这个成员基本数据类型的整数倍,即在int的基础上加4
    char third[5];//基本数据类型位char,直接加5.现在是21
    int fouth[3];//基本数据类型为int,补足内存到24然后+12
}struct1;//例一//到这里还没有结束,因为最大数据类型为8,所以最终的结果也要是8的整数倍,向上取整。就到了40
int main(){
    struct1 example1;
    printf("%d",sizeof(example1));
}

有指针的情况的话,32位和64位指针大小分别为4和8字节,与上面一样

下面是包含柔性数组的结构体

因为柔性数组本身是无法确定有几个字节的,所以计算整体结构体大小时,会省略柔性数组的计算。在使用的时候分配内存就可以。

//
// Created by 18751 on 2023/5/30.
//
#include

typedef struct struct1{
    int first;
    double second;
    char third[5];
    int fouth[3];
    int fifth[0];
}struct1;

int main(){
    struct1 example1;
    printf("%d",sizeof(example1));
}

所以这个计算的结果和上面的大小一样,也是40.Tips柔性数组不可以在结构体中单独存在,柔性数组不可以作为结构体的第一个成员。C99标准中,允许结构体的最后一个成员为柔性数组。简单来说,柔性数组可以在使用的时候才为他去开辟空间。

明天出一下柔性数组的使用

你可能感兴趣的:(c语言,开发语言,c++)