对定义局部变量位置的思考
程序员文章站
2022-05-12 14:01:41
...
C89规定,在任何执行语句之前,在块的开头声明所有局部变量。在C99以及C++中则没有这个限制,即在首次使用之前,可在块的任何位置都可以声明变量。另一方面,编译器不同也不同,gcc编译器有很多扩展的功能,可完美支持C99标准。
所以在gcc编译下局部变量并不是一定要定义在代码块的开始位置,可以如下进行定义。
#include <stdio.h>
void test(void *arg)
{
printf("ssssss\n");
}
int main(int argc, char *argv[])
{
char tmp[32]="ssssss\n";
test(tmp);
printf("zhang\n");
int c = 0;//
printf("zhangcf\n");
{
int dd = 5;//代码块中
int c=20;
}
int ss = 6;
return 0;
}
今天经过实践发现,其实在代码块中定义的局部变量除非不可避免,否则尽量不要使用这种方式,原因如下:
在代码执行到main中的时候dd和c的内存空间是没有进行分配的,之后当进入到第17行才会进行分配。所以在执行第17行的时候会对栈进行一次操作,如果,这个代码块是在一个循环中的话,对栈的操作就更加频繁了。虽说不会严重影响性能,但是能快一分是一分嘛。
使用gdb调试的 info locals命令可以清楚的看到这个现象。
就使用上面的例子来看,在main入口处打一个断点,然后可以看到如下的现象
可以看到这个函数块中的所有变量的内存都已经在栈内存里分配出来了,但是并没有进行赋值,应该是执行到具体的代码位置时才进行具体数值的赋值操作。现在要注意16行到19行的dd和c的两个变量是没有任何显示的。
当程序运行到17行的时候再看一下当前所有局部变量的信息如下:
可以找到代码块中dd和c了。因为局部变量肯定是在栈中分配内存,所有这个过程就涉及到了栈内存与变量的映射关系,其实就是对栈进行了操作。
下一篇: (笔记)多态:向上转型,局部变量实现多态
推荐阅读
-
CSS3对背景图片的裁剪及尺寸和位置的设定方法
-
对Pycharm创建py文件时自定义头部模板的方法详解
-
对python 自定义协议的方法详解
-
H5对自定义属性的规定和添加获取自定义属性的方法
-
对7种博客赚钱方法的一些思考 最信赖Adsense
-
DownEditTextView【自定义Edittext对Android 软键盘向下的监听】
-
关于对淘宝女装海报设计的再思考详解
-
C#_Excel数据读取与写入_自定义解析封装类_支持设置标题行位置&使用excel表达式收集数据&单元格映射&标题映射&模板文件的参数数据替换(第二版-增加深度读取和更新功能)
-
对const的总结与思考
-
微信位置怎么设置自定义(店铺自定位的操作技巧)