从汇编看c++中函数里面的static关键字的使用说明

2016-02-19 09:56 10 1 收藏

清醒时做事,糊涂时读书,大怒时睡觉,无聊时关注图老师为大家准备的精彩内容。下面为大家推荐从汇编看c++中函数里面的static关键字的使用说明,无聊中的都看过来。

【 tulaoshi.com - 编程语言 】

下面从汇编语言看其原理.

下面是c++源代码:
代码如下:

void add() {
    static int i = 1;
    i++;
}
int main() {
   add();

}

下面是main对应的汇编码
代码如下:

; 5    : int main() {

    push    ebp
    mov    ebp, esp

; 6    :    add();

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

    call    ?add@@YAXXZ                ; 调用add

; 7    :   
; 8    : }

    xor    eax, eax
    pop    ebp
    ret    0

下面是add函数对应的汇编码:
代码如下:

; 1    : void add() {

    push    ebp
    mov    ebp, esp

; 2    :     static int i = 1;
; 3    :     i++;

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

    mov    eax, DWORD PTR ?i@?1??add@@YAXXZ@4HA;取变量i的值
    add    eax, 1;执行加法
    mov    DWORD PTR ?i@?1??add@@YAXXZ@4HA, eax;存变量i的值

; 4    : }

    pop    ebp
    ret    0

可以看,不论是main函数,还是add函数里面,我们都看不到为i分配存储空间,也就是说,i不在他们的调用栈里面。

再看下面的汇编码:
代码如下:

_DATA    SEGMENT
?i@?1??add@@YAXXZ@4HA DD 01H                ; 为变量i声明存储空间
; Function compile flags: /Odtp
_DATA    ENDS

这条语句为i预先分配了存储空间,并且在上面两个函数汇编码的外面定义。因此,函数里面由static关键字修饰的变量生命期存在于整个程序里面,但是,可见性依然只在add函数里面,在外面访问不到.

来源:http://www.tulaoshi.com/n/20160219/1592766.html

延伸阅读
C#中可使用using关键字自动清除对象资源。 # MyObject.cs using System; namespace MyProjects { public class MyObject : IDisposable { public MyObject() { } public void Dispose ( ) { // Dispose Console.WriteLine ( "Disposed" ) ; // ... } } } # Class1.cs using System; namespace MyProjects { public c...
static 1.在类中,用static修饰的属性,称为静态属性。为这个类的所有对象所共有,存放在静态存储区,所有该类的对象都可以访问且访问的都是同一变量。可以用作计数器,来统计总共创建了多少个各类的对象。 2.在类中,用static 修饰的方法为静态方法,在静态方法中不可以访问非静态的属性和方法,但在非静态方法中可以访问静态方法和属性;且...
mutable要害字 要害字mutable是C++中一个不常用的要害字,他只能用于类的非静态和非常量数据成员 我们知道一个对象的状态由该对象的非静态数据成员决定,所以随着数据成员的改变, 对像的状态也会随之发生变化! 假如一个类的成员函数被声明为const类型,表示该函数不会改变对象的状态,也就是 该函数不会修改类的非静态数据成员.但...
(1)先来介绍它的第一条也是最重要的一条:隐藏。 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。 下面是a.c的内容 代码如下: char a = 'A'; // global variable void msg() {     printf("Hello\n...
全局变量的生命期和可见性是整个程序的运行期间,下面就来用汇编来看一下实际情况: c++源码: 代码如下: int i = 2;//全局变量 int main() {     int j = i; } 下面是汇编代码: 代码如下: PUBLIC    ?i@@3HA              ...

经验教程

959

收藏

51
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部