请教一个内存对齐的问题

发布于 2022-10-15 08:13:05 字数 946 浏览 36 评论 0

大家好,请教一个内存对其的问题,
             我们知道,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技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

梦开始←不甜 2022-10-22 08:13:05

内部肯定有对首地址是否对齐的判断.应该会从第一个对齐处开始以字进行复制.

左岸枫 2022-10-22 08:13:05

回复 2# liwangli1983

    不清楚,看源码好像是没有,我在仔细看看

始于初秋 2022-10-22 08:13:05

不是4字節的,是機器字長。

夏夜暖风 2022-10-22 08:13:05

有些平台上不对齐的当作整数操作会bus error的,前后那些字节不能采用这种方法的

吝吻 2022-10-22 08:13:05

有些平台上不对齐的当作整数操作会bus error的,前后那些字节不能采用这种方法的

虐人心 2022-10-22 08:13:05

有些平台上不对齐的当作整数操作会bus error的,前后那些字节不能采用这种方法的
hellioncu 发表于 2011-04-29 21:08

對,需要切頭去尾。PowerPC和MIPS體系結構下這麼做都是會引發異常的,倒不一定會由於bus error而coredump,但是會軟件讀取兩次。
對於i386體系結構也不建議這樣,因為i386處理器會自動拆成兩次讀取。

——這裡可以看出RISC和CISC的設計思想的區別喲

昵称有卵用 2022-10-22 08:13:05

大家好,请教一个内存对其的问题,
             我们知道,void *memcpy(void *to, const void *from, si ...
tianhailong 发表于 2011-04-29 16:23

    正确。应该先测试对齐边界,之前用char,对齐后用大对象,最后用char。

葬心 2022-10-22 08:13:05

回复 8# yulihua49

    刚看到您的回复,但是我看memcpy函数应该是没有做相应的对齐操作的,因为是内联编译的代码,读得也不是很清楚,还请你多多指教。

贩梦商人 2022-10-22 08:13:05

回复 5# hellioncu

    因为我看代码memcpy的一些实现是这样实现的,并没有判断字节是否对齐,好请你说的清楚些

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文