hus*_*sik 11 c optimization assembly
在C中,指针的使用是否取消了相关变量的"register"属性?
#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;
}
Run Code Online (Sandbox Code Playgroud)
给编译器错误"不能获取寄存器变量的地址",但它不是寄存器%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;
}
Run Code Online (Sandbox Code Playgroud)
如果我几乎所有的变量都是指针式的,只有三个变量只有带有"register"关键字的原始类型,那么编译器是否会使这三个变量"真正注册"的机会更高?
好.问题解决了.我学会了一些装配,发现这取决于优化级别和变量的波动性.使用__asm {}可确保它在寄存器中计算.谢谢.
cni*_*tar 27
在C中,应用于&使用说明register符声明的变量是非法的.
6.7.1
实现可以将任何注册声明简单地视为自动声明.但是,无论是否实际使用了可寻址存储,都无法显式地(通过使用 6.5.3.2中讨论的一元和运算符)或隐式地计算用存储类指定寄存器声明的对象的任何部分的地址(通过将数组名称转换为指针,如6.3.2.1中所述.
并且6.5.3.2:
一元&运算符的操作数应该是函数指示符,[]或一元*运算符的结果,或者是一个左值,它指定一个不是位字段的对象,并且不用寄存器存储类指定器声明.
至于C++,如果你使用®ister,它取消了它的含义:
ANSI C不允许获取寄存器对象的地址; 此限制不适用于C++.但是,如果在对象上使用了地址运算符(&),则编译器必须将对象放在可以表示地址的位置.实际上,这意味着在内存中而不是在寄存器中.