鱼C论坛

 找回密码
 立即注册
查看: 4058|回复: 5

根据“对齐原理”,一个字符也占4个字节??

[复制链接]
发表于 2013-3-2 17:42:57 | 显示全部楼层 |阅读模式
50鱼币
第七讲 复杂的数据类型(2)-指针_20133217355.JPG
第七讲 复杂的数据类型(2)-指针_201332173115.JPG
复杂的数据类型04_指针和数组_201332164546.JPG

因为要对齐,所以一个字符也是占4个字节?

为啥最后一章,显示的地址却是连号的,不是跟整形一样以4倍数来增加?

最佳答案

查看完整内容

首先了解下硬件的相关知识:在32位系统里,CPU有32根数据线,所以读取一次内存就要读取32个2进制位(也就是4字节),为了提高效率,CPU读取内存的其实地址只可能是4的倍数,如0,4,8,12等 接着切入正题“4字节对齐”,是为了提高COU读取数据的效率,就是说能够1次读完的数据不需要分2次读完。 以最开头的图为例: int a; char b; float c; 假设a的地址是0,b的地址是4 那么,c的地址是5就不合理,因为CPU读取变量C的时候要 ...
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-2 17:42:58 | 显示全部楼层
首先了解下硬件的相关知识:在32位系统里,CPU有32根数据线,所以读取一次内存就要读取32个2进制位(也就是4字节),为了提高效率,CPU读取内存的其实地址只可能是4的倍数,如0,4,8,12等
接着切入正题“4字节对齐”,是为了提高COU读取数据的效率,就是说能够1次读完的数据不需要分2次读完。
以最开头的图为例:
int a;
char b;
float c;
假设a的地址是0,b的地址是4
那么,c的地址是5就不合理,因为CPU读取变量C的时候要从地址4开始读,读完后再从地址8读,读完后把两次读的内容拼接起来(并去掉变量b)才能得到变量c,而如果遵循“4字节对齐”,则变量c从地址12开始编,读变量c就只要读一次。至于楼主举的例子,一堆的char在一起,每个当然都只占据一个字节,因为这样读取任何一个char变量cpu都值需要读取一次内存。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-3-2 17:51:39 | 显示全部楼层
仔细想了一下,难道是对齐,说的只是存储在硬盘上的,并不是内存运算中的数据?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-3-2 18:23:05 | 显示全部楼层
我没看到对齐那里
猜的没错的话,对齐是结构对齐
那个指针变量则默认大小
不过VC6似乎CHAR在结构中对齐也是1个字节
建议换GCC或者其他的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-3-2 21:46:52 | 显示全部楼层
对齐是和结构体相关的。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-3-3 11:41:03 | 显示全部楼层
结构体内存字节对齐方式,记住三则原则
1.数据成员对齐规则:结构体的一个元素是从offset 0开始,以后每一个成员的所占用的内存地址必须是其数据类型或子成员所占内存字节的整数倍
2.结构体作为成员,则结构体成员中最大的一个子成员占用的字节作为整数倍
3.最后,得到的整个结构体的大小必须是结构体中最大数据类型的字节的的整数倍,不足则补充。

举一个例子

struct stu
{
     int a;          // 0 - 3
     char b;       // 4
     double c;  //  8 - 15
};      // 这个结构体的大小是 16

struct stude
{
     char a;           // 0
     int b;             //  4 - 7
     struct stu s;   // 8 - 23
     double d;      // 24 - 31
};     // 这个结构体的大小 32字节


struct Stude
{
     int a;     // 0 - 3
     char b;  // 4
};    // 这个结构体大小是5,但是,必须满足规则三,结构体大小是其成员最大的整数倍,所以结果是8

以上是对结构体内存对齐的一些看法,希望对你有所帮助。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-10 16:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表