加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 存储在寄存器中的变量的地址

发布时间:2020-12-16 03:19:14 所属栏目:百科 来源:网络整理
导读:如果我的代码中的某处,我使用变量的地址(例如传递给其他一些函数),编译器会自动选择将其存储在内存中? (与将其存储在寄存器中的可能性相反). 否则,如果我要求这样一个变量的地址(存储为寄存器),会发生什么情况?我知道我们不能将变量的地址显式设置为regist
如果我的代码中的某处,我使用变量的地址(例如传递给其他一些函数),编译器会自动选择将其存储在内存中? (与将其存储在寄存器中的可能性相反).

否则,如果我要求这样一个变量的地址(存储为寄存器),会发生什么情况?我知道我们不能将变量的地址显式设置为register(注册int c).

编辑:

例如,如果我做某事

int c = 1;
print("Address of c: %p",&c);

那么这个变量不能存储在一个寄存器中,可以吗?编译器会自动将其设置为存储在内存中?否则(如果它只是存储在一个寄存器中),屏幕上显示的地址是什么?

解决方法

首先,C标准禁止使用已声明注册的变量的地址,就像在结构体中的位域一样.

对于非注册(“auto”)变量,简短的答案是肯定的.优化器的最简单的策略是立即溢出其地址被占用的变量.

“溢出”只是从寄存器分配的文献中的一个术语,意思是“决定将其置于记忆而不是注册”.

复杂的优化器可以进行别名分析,并且仍然在寄存器中保存一个值,尽管它的地址已被采用.无论何处可以证明生成的指针不可能用于更改值,这是可能的.

另一个相关的优化是实时分割.这允许将变量存储在寄存器中用于存储有用值(其“活动范围”)的部分指令范围,并将其溢出到其他部分.在这种情况下,溢出的部分将对应于指针可能用于更改变量值的位置.例如:

x = 3;
... lots of computations involving x
if T {
  // SPILL HERE,so store register holding x to memory
  int *p = &x;
  ... lots of computations,perhaps using p to change x
  *p = 2;
  // DONE SPILL HERE,so reload register
  ... more code here not using p to change x.
}
else {
  ... lots of computations involving x.
}

该代码的积极优化器可能为x分配堆栈位置,但将其加载到代码顶部的注册表中,将其保留在除了标记为SPILL的区域之外.该区域将被存储器的存储器和匹配的寄存器负载包围.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读