zoukankan      html  css  js  c++  java
  • 理解各种数据类型和简单类在内存中的存在形式。

    #include <iostream>
    #include <stdio.h>
    
    using namespace std;
    
    
    int g_int=5;
    
    int main()
    {
        int a=3;
        char cc='a';
        float b=3.12;
        char c[]="hi";
        char d[9]={'h','i','.','i','i','i',''};
        char * p="hi,linson";
        int g=g_int;
    
        printf("%0x
    ",&a);
        printf("%0x
    ",&cc);
        printf("%0x
    ",&b);
        printf("%0x
    ",&c[0]);
        printf("%0x
    ",&d[0]);
        printf("%0x
    ",&p);
    
        printf("%0x
    ",&g_int);
        printf("%0x
    ",&p[0]);
    
        return 0;
    }

    结果:

    汇编代码:

        .file    "main.cpp"
    .lcomm __ZStL8__ioinit,1,1
        .globl    _g_int
        .data
        .align 4
    _g_int://全局变量
        .long    5
        .def    ___main;    .scl    2;    .type    32;    .endef
        .section .rdata,"dr"
    LC1://指针数据
        .ascii "hi,linson"
    LC2://mian函数地址
        .ascii "%0x12"
        .text
        .globl    _main
        .def    _main;    .scl    2;    .type    32;    .endef
    _main:
        pushl    %ebp
        movl    %esp, %ebp
        andl    $-16, %esp
        subl    $48, %esp
        call    ___main
        movl    $3, 40(%esp)
        movb    $97, 39(%esp)
        movl    LC0, %eax
        movl    %eax, 32(%esp)
        movw    $26984, 29(%esp)
        movb    $0, 31(%esp)
        movl    $0, 20(%esp)
        movl    $0, 24(%esp)
        movb    $0, 28(%esp)
        movb    $104, 20(%esp)
        movb    $105, 21(%esp)
        movb    $46, 22(%esp)
        movb    $105, 23(%esp)
        movb    $105, 24(%esp)
        movb    $105, 25(%esp)
        movl    $LC1, 16(%esp)
        movl    _g_int, %eax
        movl    %eax, 44(%esp)
        leal    40(%esp), %eax
        movl    %eax, 4(%esp)
        movl    $LC2, (%esp)
        call    _printf
        leal    39(%esp), %eax
        movl    %eax, 4(%esp)
        movl    $LC2, (%esp)
        call    _printf
        leal    32(%esp), %eax
        movl    %eax, 4(%esp)
        movl    $LC2, (%esp)
        call    _printf
        leal    29(%esp), %eax
        movl    %eax, 4(%esp)
        movl    $LC2, (%esp)
        call    _printf
        leal    20(%esp), %eax
        movl    %eax, 4(%esp)
        movl    $LC2, (%esp)
        call    _printf
        leal    16(%esp), %eax
        movl    %eax, 4(%esp)
        movl    $LC2, (%esp)
        call    _printf
        movl    $_g_int, 4(%esp)
        movl    $LC2, (%esp)
        call    _printf
        movl    16(%esp), %eax
        movl    %eax, 4(%esp)
        movl    $LC2, (%esp)
        call    _printf
        movl    $0, %eax
        leave
        ret
        .def    ___tcf_0;    .scl    3;    .type    32;    .endef

    结论:

    全局变量:放入堆中。所以所有函数都可以引用,只要未free。

    如:语句:int g_int=5;       汇编:_g_int:

    局部基本类型变量:只存在指令中,当执行指令转到此函数时,由指令把数据放入到函数栈地址。

    如: 

    语句:int a=3;             movl $3, 40(%esp)

    指针:程序一加载,和全局变量一样,数据放入堆中,

    语句:char * p="hi,linson"; 如:LC1:.ascii "hi,linson"

    当执行指令转到此函数时,由指令把堆中地址放入到指针变量所在的函数栈地址。如: movl $LC1, 16(%esp)

     
  • 相关阅读:
    common-pool2连接池详解与使用
    Nginx实现页面缓存
    Nginx实现动静分离
    lnmp环境下nginx配置‘负载均衡’
    用phpstudy搭建的lnmp环境下mysql授权远程连接
    新浪OAuth网络登录,请求access_token时遇到21323的错误
    使用curl进行模拟登录
    yii2.0分页
    yii2.0表单自带验证码
    yii2.0查询关联数据以及widgets小部件
  • 原文地址:https://www.cnblogs.com/lsfv/p/5563392.html
Copyright © 2011-2022 走看看