11

在 C 中,指针的使用会取消关联变量的“注册”属性吗?

#include<stdio.h>
#include<stdlib.h>
int main()
{
    register int clk=0;    //maybe register maybe not
    int *adr=&clk;         //not a register now? i have its address
    *adr=1;  //if i use this 1000000 times, does it exist in L1 at least?
    printf("%d",clk);
    return 0;

}

给出编译器错误“不能获取寄存器变量的地址”,但它不是寄存器 %100。这只是一个机会。

这是最慢的循环吗?

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int *p;
    int i=0;
    p=&i;
for(*p=0;(*p)<100;(*p)++)
{
    //do nothing
}
    printf("%d ",i);
    return 0;

}

如果我使用“register”关键字将几乎所有变量都设为指针样式并且只有三个变量只有原始类型,那么编译器是否会使这三个变量“真正注册”的机会更高?

好的。问题解决了。我学习了一些组装,发现这取决于优化级别以及变量的波动性。使用 __asm{} 确保它在寄存器中计算。谢谢。

4

2 回答 2

27

在 C 中,应用于使用说明符&声明的变量是非法的register

6.7.1

实现可以将任何寄存器声明简单地视为自动声明。然而,无论是否实际使用了可寻址存储,使用存储类说明符寄存器声明的对象的任何部分的地址都无法显式计算(通过使用6.5.3.2 中讨论的一元 & 运算符)或隐式计算(如 6.3.2.1 中所述,将数组名称转换为指针)。

和 6.5.3.2:

一元 & 运算符的操作数应该是函数指示符、[] 或一元 * 运算符的结果,或者是一个左值,它指定一个不是位域且未使用寄存器存储类说明符声明的对象.

至于 C++,如果你使用 & 和 a register,它会取消它的含义:

ANSI C 不允许获取寄存器对象的地址;此限制不适用于 C++。但是,如果在对象上使用了地址运算符 (&),编译器必须将对象放在可以表示地址的位置。实际上,这意味着在内存中而不是在寄存器中。

于 2012-07-09T10:33:53.157 回答
1

you are right, if you use & to a register variable, that make this variable to main memory, so you can get it's address. because register variable have not address.

于 2012-07-09T10:38:37.260 回答