结构体的对齐访问

来源:互联网 发布:在淘宝卖假货会坐牢吗 编辑:程序博客网 时间:2024/06/06 04:58

1、结构体对齐访问实例

#include <stdio.h>struct s {    char b;    int   c;};int main(void){    printf("sizeof(struct s) = %d.\n",sizeof(struct s));        //8    struct s s1;    s1.b    = 't';    s1.c    = 12;    char *p1 = (char*)(&s1);    printf("*p1 = %c.\n",*p1);          //t    int *p2 = (char*)((int)&s1 + 1);    printf("*p2 = %d.\n",*p2);          // 201852036    int *p3 = (char*)((int)&s1 + 4);    printf("*p3 = %d.\n",*p3);          // 12    return 0;}

2、结构体为何要对齐访问
访问结构体元素时需要对齐访问,主要是为了配合硬件,也就是说硬件本身有物理上的限制,因此对齐排布和访问可以提高访问效率。
3、结构体对齐的规则和运算
(1)当编译器将结构体设置为4字节对齐时,结构体整体必须从4字节对齐处存放,结构体对齐后的大小必须为4的倍数。如果编译器设置为8字节对齐,则这里的4就是8。
(2)结构体中每个元素本身也必须对齐存放。
(3)编译器在考虑以上两点情况下,实现以最少内存来开辟结构体空间。
4、手动对齐
如果编译器自动实现结构体对齐,我们称之为自动对齐,与之相反,使用#pragma对齐的就是手动对齐。
我们需要以#pragma pack(n)开头,以#pragma pack()结尾,定义一个区间,这个区间内的对齐参数就是n。

#include <stdio.h>#pragma pack(4)struct mystruct1 {    int a;    char b;    short c;};struct mystruct2 {    char a;    int b;    short c;};typedef struct myStruct5 {    int a;    struct mystruct1 s1;    double b;    int c;}MyS5;struct stu {    char sex;    int length;    char name[10];};#pragma pack()int main(void){    printf("sizeof(struct mystruct1) = %d.\n",sizeof(struct mystruct1));    printf("sizeof(struct mystruct2) = %d.\n",sizeof(struct mystruct2));    printf("sizeof(struct mystruct5) = %d.\n",sizeof(MyS5));    printf("sizeof(struct stu) = %d.\n",sizeof(struct stu));    /*        *   sizeof(struct mystruct1) = 8.       *    sizeof(struct mystruct2) = 12.       *    sizeof(struct mystruct5) = 24.       *    sizeof(struct stu) = 20.       */    return 0;}

这里写图片描述

原创粉丝点击