是否可以在cpu注册表中保留整个数组

在下面的代码中,
int main( )
{
    register int arr[4];
    /* ... */
}

在某些cpu注册表中可以分配’arr’.
(考虑cpu有4个或更多的寄存器).

或者编译器将忽略阵列的寄存器存储类.

解决方法

根据我的理解,答案是YES和NO.

不,因为,

>任何数组元素必须明确地可寻址(例如,对于16位uC / uP,其地址应始终位于0x0000到0xFFFF地址空间之间)
>使用寄存器直接寻址模式(如mov r2,#100)访问cpu寄存器.
该寻址模式没有有效的地址. (即使不被认为是寻址模式)
>数组元素必须驻留在连续的内存位置. (对于指针算术,使用数组的主要原因)

是的,

>编译器可以为上面的数组分配寄存器,这样我们可以对它进行一些有限的操作.
但是内部使用地址进行优化的操作不能使用.

见下面的代码.

int main( )
{
  register int arr[4];
  int i;

  arr[0] = 10;      /* OK */
  arr[1] = 20;      /* OK */
  arr[2] = 30;      /* OK */
  arr[3] = 40;      /* OK */

  for(i=0;i<4;i++)
    arr[i]=10;    /* Error : "address of register variable 'arr' requested" */

  return 0;
}

所以我的最后的结论是,理想的注册存储类不应该与数组一起使用,即使你的编译器允许它.

请更正我或给予更多的投入.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...