`
helpbs
  • 浏览: 1161737 次
文章分类
社区版块
存档分类
最新评论

三谈内存对齐问题

 
阅读更多

请同时参考:

1. 关于内存对齐问题

2. 再谈内存对齐问题

内存对齐问题,大家已经说了很多。今天碰到一个帖子,内涵内存对齐问题,大家争论得比较激烈,在争论的过程中,加深了对这个问题的认识。

第一种情况:

struct BBB

{

long num; // 4bytes

char *name; // 4 bytes

short int data; // 2 bytes

char ha; // 1 byte

short ba[5]; // 10 bytes

};

sizeof(BBB) = 24bytes

理由:

1. 很容易知道BBB的内存对齐数是4bytes

2. num和name各为4bytes,已经对齐

2. data和ha加起来是3bytes,因此要补1byte

3. ba共10bytes,因此要补2bytes

第二种情况:

struct BBB

{

long num; // 4 bytes

char *name; // 4 bytes

short int data; // 2 bytes

char ha; // 1 byte

char hb; // 1 byte

short ba[5]; // 10 bytes

};

sizeof(BBB) = 24bytes

理由:

1. 很容易知道BBB的内存对齐数是4bytes

2. num和name各为4bytes,已经对齐

2. data、ha和hb加起来是4bytes,已经对齐

3. ba共10bytes,因此要补2bytes

第三种情况:

struct BBB

{

char hb; // 1 byte

long num; // 4 bytes

char *name; // 4 bytes

short int data; // 2 bytes

char ha; // 1 byte

short ba[5]; // 10 bytes

};

sizeof(BBB) = 28bytes

理由:

1. 很容易知道BBB的内存对齐数是4bytes

2. hb为1byte,因此需要补3bytes

3. num和name各为4bytes,已经对齐

4. data、ha加起来是3bytes,因此要补1byte

5. ba共10bytes,因此要补2bytes

通过上述三种情况,我们可以得出推论:

a. 尽管成员变量一样,如果由于排列的顺序不同,则所得到对象的大小也有可能不同

b. 相同数据类型的成员变量,在结构或类定义时,尽量相邻,这样可以减少空间的消耗

下面再举一个例子,来说明上述推论b:

假定结构BBB定义如下:

struct BBB

{

char ha;

int a;

char hb;

int b;

char hc;

int c;

};

那么sizeof(BBB) = 24bytes

如果结构BBB的定义改为:

struct BBB

{

char ha;

char hb;

char hc;

int a;

int b;

int c;

};

那么sizeof(BBB) = 16bytes

可见在两种情况下结构BBB所能承载的数据量是一样的,但所占用的空间却有很大的不同。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/pathuang68/archive/2009/06/03/4240404.aspx

分享到:
评论

相关推荐

    C++初学者指南(原版)

    指针是包含内存地址的对象。通常,指针用于访问另一个对象的值。 第 5 章:函数简介 此模块开始深度探讨函数。函数是 C++ 的构建基块,深入理解函数是成为成功 C++ 编程人员的基础。下面,您将了解如何创建函数。您...

    浅谈C语言的字节对齐 #pragma pack(n)2

    这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式。 #pragma pack (n) 作用:C编译器将按照n个字节对齐。 #pragma pack () 作用:取消自定义字节对齐方式。 #...

    C/C++程序员面试指南.杨国祥(带详细书签).pdf

    面试题24:结构体内存对齐问题 3.6 C和C++的区别 面试题25:关键字static在C和C++中的区别 面试题26:C语言的结构体和C++的有什么区别 面试题27:C中的malloc和C++中的new有什么区别 面试题28:C++的引用和C语言的...

    ARM嵌入式软件编程经验谈

    和很多 RISC 处理器一样,ARM 系列处理器的内存访问,也要求数据对齐,即存取“字(Word)”数据时要求四字节对齐,地址的bits[1:0]==0b00;存取“半字(Halfwords)”时要求两字节对齐,地址的bit[0]==0b0;存取“字节...

    嵌入式系统/ARM技术中的ARM嵌入式软件编程经验谈

    和很多 RISC 处理器一样,ARM 系列处理器的内存访问,也要求数据对齐,即存取“字(Word)”数据时要求四字节对齐,地址的bits[1:0]==0b00;存取“半字(Halfwords)”时要求两字节对齐,地址的bit[0]==0b0;...

    x64进程远程hook,x64_远程调用函数,源码更新V1.8.2:2021/4/12-易语言

    浅谈64位进程远程hook技术: https://bbs.125.la/forum.php?mod=viewthreadtid=14666356extra= 不管您是转载还是使用请保留版权,源码在精益论坛免费发布本人未获利,请不要用于非法途径。 -------------------------...

    Python 核心编程 第二版

    全书分为两个部分:第1部分占据了大约三分之二的篇幅,阐释这门语言的“核心”内容,包括基本的概念和语句、语法和风格、 Python对象、数字类型、序列类型、映射和集合类型、条件和循环、文件和输入/输出、错误和...

    Python核心编程(第二版).pdf (压缩包分2部分,第二部分)

     2.10 代码块及缩进对齐   2.11 if语句   2.12 while循环   2.13 for循环和range()内建函数   2.14 列表解析   2.15 文件和内建函数open()、file()   2.16 错误和异常   2.17 函数  ...

    Python核心编程(第二版).pdf (压缩包分2部分,第一部分)

     2.10 代码块及缩进对齐   2.11 if语句   2.12 while循环   2.13 for循环和range()内建函数   2.14 列表解析   2.15 文件和内建函数open()、file()   2.16 错误和异常   2.17 函数  ...

    Python核心编程第二版(ok)

     2.10 代码块及缩进对齐   2.11 if语句   2.12 while循环   2.13 for循环和range()内建函数   2.14 列表解析   2.15 文件和内建函数open().cfile()   2.16 错误和异常   2.17 函数  ...

    Python核心编程第二版

     2.10 代码块及缩进对齐   2.11 if语句   2.12 while循环   2.13 for循环和range()内建函数   2.14 列表解析   2.15 文件和内建函数open()、file()   2.16 错误和异常   2.17 函数  ...

Global site tag (gtag.js) - Google Analytics