关闭

struct中的字节对齐问题

标签: 字节对齐
616人阅读 评论(0) 收藏 举报
分类:

原因:CPU为了快速的存取内存从而存在内存问题


分析方法:

  • 有例子1
#include <stdio.h>
struct A{
    char a2; // 占一字节
    char a3;
    char a;
    short i; // 占两字节
};
int main(int argc, const char *argv[])
{
    struct A aa = {0x1, 0x2, 0x3, 0x5555};
    char *p = &aa;
    int i;

    printf("sizeof(struct A) = %d\n", sizeof(aa));
    for (i = 0; i < sizeof(aa); i++)
    {
        printf("%#x ", *p);
        p++;
    }
    putchar(10);

    return 0;
}

执行结果是:

sizeof(struct A) = 6
0x1 0x2 0x3 0 0x55 0x55

  • 例子2
#include <stdio.h>
struct A{
    short b;
    char a;
    int c;
};
int main(int argc, const char *argv[])
{
    char array[100] = {0x0,0x0,0,0,0,0,0,0,0};
    struct A *aa = (struct A *)array;
    aa->b = 0x1122;
    aa->a = 0x33;
    aa->c = 0x01223344;
    int i;

    printf("sizeof(struct A) = %d\n", sizeof(struct A));
    for (i = 0; i < sizeof(struct A); i++)
    {
        printf("%#2x ", array[i]);
    }
    putchar(10);

    return 0;
}

执行结果是:

sizeof(struct A) = 8
0x22 0x11 0x33 0 0x44 0x33 0x22 0x1

如果结构体是这种:

struct A{
    char a;    //这两个位置互换
    short b;    //至两个位置互换
    int c;
};

sizeof(struct A) = 8
0x33 0 0x22 0x11 0x44 0x33 0x22 0x1


结论/方法:

  • 当一个结构体中有不同的数据时,在 linux 中遵循 1,2,4的对齐方式,注意没有 8
  • 结构体中的占字节数最多的元素决定二维容器的宽度
  • 最近的两个数据要对齐到其中最大的边界上,小的那个要用0来对齐。比如 1,2 则对齐的方式是1 0 2 。

图形表示:

在程序一和程序二中内存的情况是:

这里写图片描述 这里写图片描述

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:219824次
    • 积分:4720
    • 等级:
    • 排名:第6555名
    • 原创:236篇
    • 转载:13篇
    • 译文:3篇
    • 评论:12条
    博客专栏