二十. 一些探究

全局变量:放在了数据段,大家都能用
局部变量:放到了栈中,给专门函数使用的

二十. 一些探究_第1张图片
例子
二十. 一些探究_第2张图片
汇编获取全局变量和局部变量的区别
二十. 一些探究_第3张图片
解释为啥要这样改

在编译之后,全局变量的偏移量基本确定了,就是0x22b2在同一个编译器上内存位置基本相同,这个值不变;rip会改变在内存中

二十. 一些探究_第4张图片
a,b

二十. 一些探究_第5张图片
改变的就是你的程序在整个内存中的位置,但是a这个偏移相对于于程序不变 无论是8086,还是64位,都是一定的,编译之后,地址相同

但是局部变量地址有可能改变,不是一定不变的,因为多个不同函数调用test(),不同函数,一定对应不同的内存地址,虽然sum函数是对应这个test,相对地址不变,但是他们的真实地址还是改变的;


以下都是Xcode的内容,和8086基本相同

字符串地址也是不定的,是确定的,和常量相同;

二十. 一些探究_第6张图片
xcode优化选项
二十. 一些探究_第7张图片
在实际开发中,这些没有用到的变量,编译器并没有给他分配空间

为什么说switch比if效率高?
如果switch的比较情况比较多,他会自动的有一套算法,然后一下子直接找到位置,异步到位,而if,就会一个一个比较,所以比较慢

二十. 一些探究_第8张图片
switch内部有算法优化,一部找到了结果,不会一一比较

看到反汇编就可以了!!!

你可能感兴趣的:(二十. 一些探究)