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

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

下面是c++源代码:

复制代码 代码如下:

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

}

下面是main对应的汇编码

复制代码 代码如下:

; 5    : int main() {

    push    ebp
    mov    ebp, esp

; 6    :    add();

    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++;

    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函数里面,在外面访问不到.

时间: 2024-12-22 14:53:10

从汇编看c++中函数里面的static关键字的使用说明_C 语言的相关文章

关于C++中的static关键字的总结_C 语言

1.面向过程设计中的static1.1静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量.我们先举一个静态全局变量的例子,如下: 复制代码 代码如下: //Example 1#include <iostream.h>void fn();static int n; //定义静态全局变量void main(){  n=20;  cout<<n<<endl;  fn();} void fn(){ n++;  cout<<n<

C++中函数使用的基本知识学习教程_C 语言

函数是执行某种操作的代码块.函数可以选择性地定义使调用方可以将实参传递到函数中的输入形参.函数可以选择性地返回值作为输出.函数可用于在单个可重用块中封装常用操作(理想情况是使用可清晰地描述函数行为的名称).以下函数从调用方接受两个整数并返回其总和:a 和 b 是 int 类型的参数. int sum(int a, int b) { return a + b; } 可以从程序中任意数量的位置调用函数.传递给函数的值是实参,其类型必须与函数定义中的形参类型兼容. int main() { int i

从汇编看c++中的多态详解_C 语言

在c++中,当一个类含有虚函数的时候,类就具有了多态性.构造函数的一项重要功能就是初始化vptr指针,这是保证多态性的关键步骤. 构造函数初始化vptr指针 下面是c++源码: class X { private: int i; public: X(int ii) { i = ii; } virtual void set(int ii) {//虚函数 i = ii; } }; int main() { X x(1); } 下面是对应的main函数汇编码: _main PROC ; 16 : in

dedecms-织梦中标签里面的sql语句中arc是什么表?

问题描述 织梦中标签里面的sql语句中arc是什么表? 这是arclist标签中的一段. 这个arc是什么表,估计是dede_archives ,但是怎么能这样写的呢? $query = "SELECT arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,tp.namerule,tp.namerule2,tp.ispart, tp.moresite,tp.siteurl,tp.sitepath $addfields

iOS环信SDK 导入Demo中3rdparty里面的VoiceConvert这个库,会报Undefined symbols for architecture i386

问题描述 iOS环信SDK 想集成Demo中已经写好的UI,导入Demo中3rdparty里面的VoiceConvert这个库,会报Undefined symbols for architecture i386,删掉就能正常运行. 解决方案 你对照demo看下,是不是少库.

关于.NET中WinForms里面的ListBox实现数据绑定的...

数据 关于.NET中WinForms里面的ListBox实现数据绑定的... -------------------------------------------------------------------------------- 在.NET中,WINDOW FORMS下面的LIST BOX控件在开发时,如果采用其本身的数据绑定,绑定完以后就不能更改ListBox的Items了.而实际开发中却经常会碰到要改变的情况,在这里我提供了一重方法.采用开发继承ListBox控件的自定义控件.然后

从汇编看c++函数的默认参数的使用说明_C 语言

在c++中,可以为函数提供默认参数,这样,在调用函数的时候,如果不提供参数,编译器将为函数提供参数的默认值.下面从汇编看其原理. 下面是c++源码: 复制代码 代码如下: int add(int a = 1, int b = 2) {//参数a b有默认值    return a + b;}int main() {   int c= add();//不提供参数 } 下面是mian函数里面的汇编码: 复制代码 代码如下: ; 4    : int main() {     push    ebp 

概述C++中的 public protected private friend关键字的用法_C 语言

一个C++类中的变量如果如下关键字作为修饰符. 1. public: 程序的任何地方都可以访问. 2 protected: 只有类本身及其派生类和其友元函数,友元类可以访问. 3 private: 只有类本身及其友元函数,友元类可以访问. 4 friend: 用于定义友元函数友元类. 在类里声明的一个普通函数,在前面加上friend修饰符,这个函数就可以访问该类的一切成员,包括private成员. 下面在看下c++ public private protected关键字 1.当在类的内部使用这三

在VC中隐藏控制台程序窗口的实现代码_C 语言

下面就介绍一下,如何隐藏win32 console application的console窗口因为此种方法是通过设置编译器的链接开关来实现,所以让我们来看一下编译器的链接开关选项(也就是linker选项).首先我们来看一下linker的 /subsystem 选项该选项的语法形式如下: /subsystem:{console|efi_application|efi_boot_service_driver|efi_rom|efi_runtime_driver|native|posix|window