C语言中的struct——内存对齐

2 篇文章 0 订阅

sizeof计算结构体大小的时候具体是怎样计算的

内存对齐的原则是根据最宽数据类型的大小进行对齐的

struct A
{
    char a;   1+1
    short b;  2
    int c;    4
};

大小是8个字节

要进行内存对齐,是根据int -> 4个字节对齐的

|char|---|short |   4字节
|------int------|   4字节

如上是这样对齐的

 

struct A
{
    int a;   4
    char b;  1+1
    short c; 2
};

大小是8个字节

|------int------|   4字节
|char|---|short |   4字节

 

struct A
{
    char a;    1+1
    short b;   2
    short c;   2+2
    int d;     4
};

大小是12个字节


|char|---|short |   4字节
|  short  | ------|4字节
|------int------|   4字节

 

struct A
{
    char a;     1+1
    short b;    2+4
    double c;   8
    char d;     1+3
    int e;      4
    int f;      4
    char g;     1+3
    short h;    2+2
    int I;      4
    short j;    2
    char K;     1+1
    short L;    2+2
};

大小为48个字节

来一个究极长的

|char|---|short |---------|   8字节
|                 double             |   8字节
|char|---------|      int      |   8字节
|      int      |char|---------|   8字节
|  short  |------|     int       |   8字节
|  short  |char|----| short |-----|  8字节

 

typedef struct A
{
    char a;
    short b;
    int c;
}A;
typedef struct B
{
    char a;    1+2
    short b;   2
    A c;       8
    short d;   2+2
}B;


结构体B的大小为16

以结构体中最长的int数据类型的大小进行内存对齐

typedef struct A
{
    int a;
    short b;
    static int c;
}A;


大小为8字节

这个结构体中包含静态数据成员,而静态数据成员的存放位置与结构体实例的存储地址无关(注意只有在C++中结构体中才能含有静态数据成员,而C中结构体中是不允许含有静态数据成员的)。其在内存中存储方式如下:

|--------int--------|   4字节
|--short-|----|---- |    4字节

 

struct A
{
    
};

一个空结构体中,在c中大小为0,c++中大小为1

 

参考http://www.cnblogs.com/longlybits/articles/2385343.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值