内存对齐

解析内存对齐 Data alignment: Straighten up and fly right的详解

Data alignment: Straighten up

什么是字节对齐,为什么要对齐?

关于内存中的数据对齐

About Data Alignment


内存对齐规则:

1、结构体的大小是结构体中所有数据类型所占内存字节数的最大值的整数倍

2、结构体内的成员的首地址相对于结构体首地址的偏移量是其类型大小的整数倍,比如说 double 型成员相对于结构体的首地址的地址偏移量的应该是 8 的倍数;

3、为了满足规则 1 和 2 编译器会在结构体成员之后进行字节填充!

  具体案例可参见 点击打开链接


  参见如下代码:

#include <stdio.h>

struct A
{
    char i;
    char c;
    int j;
    char a[13];
} a;

int main()
{
    printf("%d\n",sizeof(a));
    return 0;
}
 

   输出 24。

    解析:这里 struct 中第一个 和第二个为 char 类型,只占 1 个字节,由于默认是以 4 字节对齐,故这两个 char 会占用第一个 4字节,剩余两个字节,由于第 3 个 为 int 类型,

剩余的 2 个字节不够存储,则会自己再开辟一个 4 字节空间供自己存储, 第 4 个 数据类型为 char 数组,但本质上还是 char 类型,故会占用 13 个字节,由于类存对齐,必为 4

的整数倍,多以会占用 16 个字节。

  见如下代码:

#pragma pack(8)
#include <stdio.h>

struct A
{
    int i;
    char c;
    int j;
    char a[13];
} a;

int main()
{
    printf("%d\n",sizeof(a));
    return 0;
}
~

  此时在程序开头加了条语句,此语句为修改 内存对齐字节数,将默认的 4 字节改为 8 字节,同上面的分析,可得


内存对齐(转帖) 

深入理解c/c++ 内存对齐

(未细看)内存对齐(涉及gcc) 

关于VC,GCC成员变量的内存对齐和偏移量的问题



C++ 类的内存对齐,见如下代码:

class CTest
{
    public:
        CTest():m_chData(‘\0’),m_nData(0)
        {
        }
        virtual void mem_fun(){}
    private:
        char m_chData;
        int m_nData;
        static char s_chData;
};
char CTest::s_chData=’\0’;

问 1)当以 4 字节对齐时, sizeof(CTest)的值是多少?

     2)当以 1 字节对齐时,sizeof(CTest)的值是多少?

     这里注意类的内存对齐与struct 的内存对齐会有些不同,类的内存对齐会考虑虚函数表指针哦。

具体可以参见:

上精华图:一张图说明类中成员变量,成员函数,静态变量与函数的空间位置。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值