在C/C++编程语言中,register关键字声明的变量速度最快,而内存分配方式主要包括:静态存储区分配,栈分配,堆分配。
register关键字请求编译器将变量尽可能放入CPU寄存器中,避免内存寻址访问,从而提高效率。一个CPU的寄存器是有限的,通常定义的register变量也不能太多,我们看如下图
即数据从内存中拿出来放到寄存器里,然后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。