c语言中的reg什么意思(c语言regcomp)

在C/C++编程语言中,register关键字声明的变量速度最快,而内存分配方式主要包括:静态存储区分配,栈分配,堆分配。

register关键字请求编译器将变量尽可能放入CPU寄存器中,避免内存寻址访问,从而提高效率。一个CPU的寄存器是有限的,通常定义的register变量也不能太多,我们看如下图

c语言中的reg什么意思(c语言regcomp)插图

即数据从内存中拿出来放到寄存器里,然后CPU从寄存器中获取数据进行处理,处理完成后再把数据通过寄存器放到内存里,可以看出CPU是不直接与内存进行交互的。

那么为什么会有寄存器的存在,而不是直接通过CPU访问内存呢? 主要是考虑到速度。寄存器本质上也是一块块小的存储空间,只不过它的存取速度要比内存快很多。一般来说,如果某个变量用得比较频繁,可以将它放在寄存器中以提高效率。在C语言中使用方式如下

int sum = 0;

register int x = 2;

for (register int i = 1; i <= 100; i++) {

sum += i;

}

printf("%d\n", sum);

注意因为register的变量不放在内存中,所以不能用&符号来获取变量的地址。

对于静态存储区分配定义的变量,它在程序执行的整个生命周期都存在。在C/C++中,通过static关键字声明的变量和全局变量都是在静态存储区分配的。如下代码

int a = 2;

int main() {

static int b = 3;

printf("%d\n", a + b);

return 0;

}

a和b都是属于静态存储区分配的变量。

栈是一块连续的内存区域,而且栈顶的位置和栈的最大容量是系统预设好的,通常栈的大小为2M,不同机器可能有差异,如果申请的空间超过栈的剩余空间时,就会出现overflow的错误。比如通常在申请较大的数组,编译时就出现错误。

通常普通的局部变量都是存储在栈中的,它的特点是内存由系统自动分配,用完后就立即自动释放。如下代码

int add(int a, int b) {

int c = 0;

c = a + b;

return c;

}

int main() {

int a = 2;

int b = 3;

printf("%d\n", add(a, b));

return 0;

}

局部变量a、b、c都是由栈来分配内存。

与栈不一样,堆分配的内存空间可能是不连续的,因为系统是用链表来存储空闲内存地址的,堆的大小受限于计算机系统中有效的虚拟内存,堆分配的空间比较大且灵活。

通常用new或malloc申请的变量存在于堆中的,对于堆来说,它的变量是程序员自己来申请内存,并且需要自己释放的,如果忘记释放会造成内存泄漏。如下代码

int *p = (int *)malloc(10 * sizeof(int));

for (int i = 0; i < 10; i++) {

*(p + i) = i ;

}

for (int i = 0; i < 10; i++) {

printf("%d ", *(p + i));

}

free(p);

变量p就是在堆里申请内存的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如有侵权请联系网站管理员删除,联系邮箱1856753@qq.com。

0
显示验证码
没有账号?注册  忘记密码?