我有这样的东西
register unsigned int a, b, c;
int n;
for (n = 0; n < 10; ++n){
c = a + b
b = a
a = c
array[n] = c;
}
不管它做什么,都无关紧要。代码以现在的方式运行得很快,如果删除register关键字,则运行速度会变慢。然而,当我在int n之前添加寄存器时,它实际上运行得比现在慢,但比不使用寄存器时要快。
有人能给我解释一下吗?谢谢。
我分解了一个简单的DOS .COM程序,有一些保存和恢复寄存器值的代码
PUSH AX ; this is the first instruction
PUSH CX
....
POP CX
POP AX
MOV AX, 0x00 0x4C
INT 21 // call DOS interrupt 21 => END
这与C程序中的函数序言和结语非常相似。但是prologues是由编译器自动添加的,上面的程序是用汇编程序手工编写的,所以程序员完全负责保存和恢复这段代码中的值。
我的问题是,如果我无意中忘记在我的程序中保存一些寄存器,会发生什么?
如果我故意在HEX编辑器中将这些指令替换为
假设我有以下C代码:
int array[10] = {10, 5, 2, 20, 20, -5, 3, 19, 9, 1};
void main(void)
{
printArray(0, 9);
}
void printArray(int startIndex, int endIndex)
{
// prints out the numbers in the order starting from startIndex
// and ending at endIndex
}
我会将这个C代码转换成MIPS,如下所示:
.text
.glo
我很想知道register存储说明符在C/C++中的行为。下面的程序在C++中是有效的,但是对于C,它是无效的。
int main()
{
register int i;
int* b = &i; // Valid in C++ but not in C
}
那么,我的问题I,,为什么C++允许地址运算符(&)进入寄存器变量?
P.S :我知道寄存器存储说明符在现代编译器中是不可取的。
__global__ void add( int *c, const int* a, const int* b )
{
int x = blockIdx.x;
int y = blockIdx.y;
int offset = x + y * gridDim.x;
c[offset] = a[offset] + b[offset];
}
在上面的示例中,我猜x、y、offset保存在寄存器中
nvcc -Xptxas -v给予4 registers, 24+16 bytes smem
分析器显示4个寄存器
ptx file:.reg .u16 %rh&