【求助】下面代码为什么要分别用数组和指针?

ouzhouren 2013-09-10 09:05:25
小弟最近在看VxWorks的启动代码,其中有个函数将地址范围是buf~buf+nlongs填充为val。原代码如下:
LOCAL void fillLongs (buf, nlongs, val)
FAST UINT *buf; /* pointer to buffer */
UINT nlongs; /* number of longs to fill */
FAST UINT val; /* char with which to fill buffer */

{
FAST UINT *bufend = buf + nlongs;
FAST UINT nchunks;

/* Hop by chunks of longs, for speed. */
for (nchunks = nlongs / 8; nchunks; --nchunks)
{
#if (CPU_FAMILY == MC680X0)
*buf++ = val; /* 0 */
*buf++ = val; /* 1 */
*buf++ = val; /* 2 */
*buf++ = val; /* 3 */
*buf++ = val; /* 4 */
*buf++ = val; /* 5 */
*buf++ = val; /* 6 */
*buf++ = val; /* 7 */
#else
buf[0] = val;
buf[1] = val;
buf[2] = val;
buf[3] = val;
buf[4] = val;
buf[5] = val;
buf[6] = val;
buf[7] = val;
buf += 8;
#endif /* CPU_FAMILY == MC680X0 */
}

/* Do the remainder one long at a time. */
while (buf < bufend)
*buf++ = val;
}

问题:为什么要区分CPU类型,然后一种用指针形式赋值,另外一种用数组形式赋值?感觉用哪一种方法都无所谓的。求大神解释!
...全文
553 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
YTerrenceLau 2013-10-18
  • 打赏
  • 举报
回复
猜测是优化指令长度的。你可以查查看,MC68xx是否有load/store指令顺带++操作的, 或者没有offset load/store指令,如果是的话,前者的代码应该会被编译成一条指令,后者需要两条。
digipoem 2013-10-18
  • 打赏
  • 举报
回复
转成汇编看看,常规CPU可以带常量偏移寻址,数组赋值就是一条汇编指令。 MC680X0不能带常量偏移寻址,用数组效率低。
feng_qing_cui 2013-09-28
  • 打赏
  • 举报
回复
val和buf是同一种数据类型,这种情况的赋值不用考虑CPU的大小端问题吧!
kitten1 2013-09-16
  • 打赏
  • 举报
回复
引用 5 楼 KISSMonX 的回复:
还是不一样的. 用数组应该就是为了显式区别不同. 后面一种还有一条语句才是重点:
buf += 8;
表明了这很可能是因为 CPU 的位数区别 16/32bit. MC680X0 是 32bit 的. 其余都是 16bit. 这两种位数的 CPU 编译器不一样. int 的大小规定也可能不一样. 4 字节或者 2 字节. 而 long 很可能都是 4 字节. 这样, 整段代码的意思也许是: 有一块 nlongs * sizeof(long) 字节大小的内存区域. 分成 nchunks(nlongs / 8) 块, 每一块的前 8 个 uint 都为 val, 块内剩下的区域不管了也就是 buf + 8 的意思. 整个内存区剩下的 nlongs % 8(小于 8) 也初始化为 val. 如下面这句:
 
// 解释有点乱, 大致就是这意思. 错了请指正. 
while (buf < bufend)
        *buf++ = val;
大婶哪!厉害。我也觉得是ENDIAN的问题。cpu不同类型的编译一般都是为了区分endian
咕噜咕噜斯基 2013-09-12
  • 打赏
  • 举报
回复
还是不一样的. 用数组应该就是为了显式区别不同. 后面一种还有一条语句才是重点:
buf += 8;
表明了这很可能是因为 CPU 的位数区别 16/32bit. MC680X0 是 32bit 的. 其余都是 16bit. 这两种位数的 CPU 编译器不一样. int 的大小规定也可能不一样. 4 字节或者 2 字节. 而 long 很可能都是 4 字节. 这样, 整段代码的意思也许是: 有一块 nlongs * sizeof(long) 字节大小的内存区域. 分成 nchunks(nlongs / 8) 块, 每一块的前 8 个 uint 都为 val, 块内剩下的区域不管了也就是 buf + 8 的意思. 整个内存区剩下的 nlongs % 8(小于 8) 也初始化为 val. 如下面这句:
 
// 解释有点乱, 大致就是这意思. 错了请指正. 
while (buf < bufend)
        *buf++ = val;
zodiac1111 2013-09-11
  • 打赏
  • 举报
回复
没有用过 VxWorks 也没有用过MC680X0家族的cpu,所以以下仅供参考 1.似乎与字节序有关,MC680X0应该是大端的. 2.似乎与 []退化成*有关 放狗搜到这个文件 http://telegraphics.com.au/svn/smallcnova/trunk/cc68/func.c 其中似乎有相关注释. 以上都是臆测,楼主自己斟酌.有大神了解的话望指正:D
引用 楼主 ouzhouren 的回复:
小弟最近在看VxWorks的启动代码,其中有个函数将地址范围是buf~buf+nlongs填充为val。原代码如下: LOCAL void fillLongs (buf, nlongs, val) FAST UINT *buf; /* pointer to buffer */ UINT nlongs; /* number of longs to fill */ FAST UINT val; /* char with which to fill buffer */ { FAST UINT *bufend = buf + nlongs; FAST UINT nchunks; /* Hop by chunks of longs, for speed. */ for (nchunks = nlongs / 8; nchunks; --nchunks) { #if (CPU_FAMILY == MC680X0) *buf++ = val; /* 0 */ *buf++ = val; /* 1 */ *buf++ = val; /* 2 */ *buf++ = val; /* 3 */ *buf++ = val; /* 4 */ *buf++ = val; /* 5 */ *buf++ = val; /* 6 */ *buf++ = val; /* 7 */ #else buf[0] = val; buf[1] = val; buf[2] = val; buf[3] = val; buf[4] = val; buf[5] = val; buf[6] = val; buf[7] = val; buf += 8; #endif /* CPU_FAMILY == MC680X0 */ } /* Do the remainder one long at a time. */ while (buf < bufend) *buf++ = val; } 问题:为什么要区分CPU类型,然后一种用指针形式赋值,另外一种用数组形式赋值?感觉用哪一种方法都无所谓的。求大神解释!
流型 2013-09-11
  • 打赏
  • 举报
回复
会不会是大神们的小幽默?
91program 2013-09-11
  • 打赏
  • 举报
回复
这个需要看 CPU 的手册或编译器吧 不相信的话,请去实践验证,猜没什么用。
ouzhouren 2013-09-11
  • 打赏
  • 举报
回复
引用 1 楼 guojing3625 的回复:
会不会是大神们的小幽默?
不会吧!看它写的煞有介事的,应该是MC680X0芯片有什么特殊地方。

2,184

社区成员

发帖
与我相关
我的任务
社区描述
xworks是美国 Wind River System 公司( 以下简称风河公司 ,即 WRS 公司)推出的一个实时操作系统。
社区管理员
  • VxWorks开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧