请同时参考:
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
分享到:
相关推荐
指针是包含内存地址的对象。通常,指针用于访问另一个对象的值。 第 5 章:函数简介 此模块开始深度探讨函数。函数是 C++ 的构建基块,深入理解函数是成为成功 C++ 编程人员的基础。下面,您将了解如何创建函数。您...
这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式。 #pragma pack (n) 作用:C编译器将按照n个字节对齐。 #pragma pack () 作用:取消自定义字节对齐方式。 #...
面试题24:结构体内存对齐问题 3.6 C和C++的区别 面试题25:关键字static在C和C++中的区别 面试题26:C语言的结构体和C++的有什么区别 面试题27:C中的malloc和C++中的new有什么区别 面试题28:C++的引用和C语言的...
和很多 RISC 处理器一样,ARM 系列处理器的内存访问,也要求数据对齐,即存取“字(Word)”数据时要求四字节对齐,地址的bits[1:0]==0b00;存取“半字(Halfwords)”时要求两字节对齐,地址的bit[0]==0b0;存取“字节...
和很多 RISC 处理器一样,ARM 系列处理器的内存访问,也要求数据对齐,即存取“字(Word)”数据时要求四字节对齐,地址的bits[1:0]==0b00;存取“半字(Halfwords)”时要求两字节对齐,地址的bit[0]==0b0;...
浅谈64位进程远程hook技术: https://bbs.125.la/forum.php?mod=viewthreadtid=14666356extra= 不管您是转载还是使用请保留版权,源码在精益论坛免费发布本人未获利,请不要用于非法途径。 -------------------------...
全书分为两个部分:第1部分占据了大约三分之二的篇幅,阐释这门语言的“核心”内容,包括基本的概念和语句、语法和风格、 Python对象、数字类型、序列类型、映射和集合类型、条件和循环、文件和输入/输出、错误和...
2.10 代码块及缩进对齐 2.11 if语句 2.12 while循环 2.13 for循环和range()内建函数 2.14 列表解析 2.15 文件和内建函数open()、file() 2.16 错误和异常 2.17 函数 ...
2.10 代码块及缩进对齐 2.11 if语句 2.12 while循环 2.13 for循环和range()内建函数 2.14 列表解析 2.15 文件和内建函数open()、file() 2.16 错误和异常 2.17 函数 ...
2.10 代码块及缩进对齐 2.11 if语句 2.12 while循环 2.13 for循环和range()内建函数 2.14 列表解析 2.15 文件和内建函数open().cfile() 2.16 错误和异常 2.17 函数 ...
2.10 代码块及缩进对齐 2.11 if语句 2.12 while循环 2.13 for循环和range()内建函数 2.14 列表解析 2.15 文件和内建函数open()、file() 2.16 错误和异常 2.17 函数 ...