请教一个内存对齐的问题
大家好,请教一个内存对其的问题,
我们知道,void *memcpy(void *to, const void *from, size_t n),函数实现是为了提高效率,做赋值操作时,
为了提高效率,可能按字长赋值,比如n=23时,对前20字节 按照字长赋值,如下:
while ( n-- )
(int *)to = (int *)from;
........
但是这样可能会有问题,应为char * 的数组,不保证内存对齐,就是说to,from的起始地址可能不是4字节对齐的,那么上述的赋值操作
每次需要访问两次内存,效率不一定会比
*to = *from 更高,
以上是我个人理解的,大概是我理解错了,请大家给讲解一下
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
![扫码二维码加入Web技术交流群](/public/img/jiaqun_03.jpg)
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
内部肯定有对首地址是否对齐的判断.应该会从第一个对齐处开始以字进行复制.
回复 2# liwangli1983
不清楚,看源码好像是没有,我在仔细看看
不是4字節的,是機器字長。
有些平台上不对齐的当作整数操作会bus error的,前后那些字节不能采用这种方法的
有些平台上不对齐的当作整数操作会bus error的,前后那些字节不能采用这种方法的
對,需要切頭去尾。PowerPC和MIPS體系結構下這麼做都是會引發異常的,倒不一定會由於bus error而coredump,但是會軟件讀取兩次。
對於i386體系結構也不建議這樣,因為i386處理器會自動拆成兩次讀取。
——這裡可以看出RISC和CISC的設計思想的區別喲
正确。应该先测试对齐边界,之前用char,对齐后用大对象,最后用char。
回复 8# yulihua49
刚看到您的回复,但是我看memcpy函数应该是没有做相应的对齐操作的,因为是内联编译的代码,读得也不是很清楚,还请你多多指教。
回复 5# hellioncu
因为我看代码memcpy的一些实现是这样实现的,并没有判断字节是否对齐,好请你说的清楚些