社区
C语言
帖子详情
访问未对齐的内存,处理器需要作两次内存访问?
karlfixed
2009-10-06 09:31:15
我知道如何对齐,但就是不知道Why? 访问未对齐的内存,为什么需要作两次或多次的内存访问?请指教
...全文
428
5
打赏
收藏
访问未对齐的内存,处理器需要作两次内存访问?
我知道如何对齐,但就是不知道Why? 访问未对齐的内存,为什么需要作两次或多次的内存访问?请指教
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
飞天御剑流
2009-10-06
打赏
举报
回复
1
不对齐的条件下,访问n依然从a开始,第一次读取四个字节,然后第二次再读取n剩下的那个字节,读取这剩下的一字节过程也不是只读取一个字节,而是4个字节的内容同时出现在数据线上。
karlfixed
2009-10-06
打赏
举报
回复
1
我知道32位地址线一次读4字节,但是
struct A
{
char a;
int n;
}
假设a占用1号内存,n占2~5 (不做对齐处理)
与
a占用1~4 n占用5~8
试问,如何体现出来
PS:我学过计算机组成原理和微机原理,但是讲访存的部分没什么映像。
ZangXT
2009-10-06
打赏
举报
回复
画一下地址线的结构就明白了。
32位地址线的话,对应的是4个字节的内存单元,可以一次进行读写。
galafx
2009-10-06
打赏
举报
回复
1
不知道对不对哈,我接触对齐没多久。
struct aa
{
char a;
int b;
};
假设32位机器。
如果没有对齐,那么结构体aa占5个字节。
就是a占一个(0号地址),b占后四个(1~4号地址)。
那么要读取b,32位机嘛,一次读4个字节,但是只能从能被4整除的地址单元开始读。
那么就要先读0~3,然后留下1~3三个字节。
再读4~7,留下4,这个字节。
然后再将两次的结果拼到一起。
想想,这么多工作,何只是读两次这么简单,节省了空间,但浪费了太多的时间。
arong1234
2009-10-06
打赏
举报
回复
因为CPU地址总是在对齐的地方开始,这样如果你一个4字节的整数跨越了边界,CPU不能对齐到哪个整数的开始位置,只能先取这个整数的前半部分,再取后半部分,然后拼起来一个完整的整数。这是硬件知识,当作常识即可,没必要开始学就研究这个
内存
对齐
详解
原因在于,为了
访问
未
对齐
的
内存
,
处理器
需要
作
两次
内存
访问
;而
对齐
的
内存
访问
仅
需要
一次
访问
。 (3)平台原因:不是所有的硬件平台都能
访问
任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的...
为什么
内存
不
对齐
需要
两次
访问
内存
?
我们将通过图来说明为什么
对齐
不
内存
需要
两次
访问
内存
: 先来看下图:我们将数据读入到寄存器中,并且假设我们的
处理器
以四个字节为偏移量
访问
内存
(1-4)四个字节, 显然,我们
需要
将0-3和4-5都读入到
内存
中...
为什么要
内存
对齐
?
内存
对齐
原则?如何判断大小端?
访问
未
对齐
的
内存
,
处理器
要
访问
两次
(数据先读高位,再度地位),
访问
对齐
的
内存
,
处理器
只要
访问
一次,为了提高
处理器
读取数据的效率,我们使用
内存
对齐
。Windows 默认
对齐
数为8字节,Linux 默认
对齐
数为4字节。...
[C++]
内存
对齐
的目的和原则是什么?如何调整
内存
对齐
的值
原因在于,为了
访问
未
对齐
的
内存
,
处理器
需要
作
两次
内存
访问
;然而,
对齐
的
内存
访问
仅
需要
一次
访问
。也就是说“
内存
对齐
”应该是编译器的管辖范围,非常依赖平台. 全局关闭
内存
对齐
先来看下面的结构体: struct ...
【
内存
】
内存
对齐
的原理
目录
内存
对齐
的原因
内存
对齐
的原理
内存
对齐
的原因 1.平台原因(移植原因): ...不是所有的硬件平台都能
访问
...原因在于,为了
访问
未
对齐
的
内存
,
处理器
需要
作
两次
内存
访问
;而
对齐
的
内存
访问
仅
需要
一次
访问
。你i.
C语言
69,371
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章