• 字节对齐的问题


    对于IA32指令,Linux沿用的对齐策略是:2字节数据类型的地址必须是2的倍数,而较大的数据类型(int, int*, float和double)的地址必须是4的倍数。

    Microsoft Windows对齐的要求更为严格--------任何K字节基本对象的地址都必须是K的倍数,K= 2, 4或者8。

    事实上,在扩展到X86-64指令之后,就都是后一种对齐方式了。

    这里有一点要指出的是,K字节基本对象,也就是说我们只考虑基本数据类型。

    考虑如下几个结构体:

    struct P1{int i; char c; long j; char d;};

    i的偏移量为0,要求的对齐为4

    c的偏移量为4,要求的对齐为1

    j的偏移为8,要求的对齐为8。(不是5,因为那样不满足对齐策略)

    d的偏移为16,要求的对齐为1。

    整个结构体占24字节,可以分析下,本来17字节似乎可以,但是考虑各个基本数据的对齐要求,整个结构体占用的字节数必须是8的倍数。而且

    整个结构体的对齐要求为8。(只考虑基本数据类型,所以只要按8对齐就能满足各项的对齐要求)。

    第二个结构体:

    struct p2{short w[3]; char *c[3];}(64位程序,所以指针为8字节)

    w的偏移为0,要求的对齐为2。(再次强调,只考虑基本类型)

    c的偏移为8,要求的对齐为8。

    所以整个结构体占用的字节为32,要求的对齐为8。

    第三个结构体:

    struct p3{struct P1 a[2]; struct P2 *p;};

    a的偏移为0, 要求的对齐为8。

    p的偏移为48,要求的对齐为8。

    所以整个结构体占用的字节为56,要求的对齐为8。

  • 相关阅读:
    2017.10.20
    2017.10.14
    2017.10.19
    2017.10.18
    2017.10.17
    软件工程个人作业02
    构建之法读后感03
    构建之法阅读笔记02
    二柱子问题(随机产生四则运算题目)
    课后作业2(构建之法阅读计划)
  • 原文地址:https://www.cnblogs.com/hustxujinkang/p/3970765.html
Copyright © 2020-2023  润新知