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)

     
  • 相关阅读:
    php解决与处理网站高并发 大流量访问的方法
    mysql事务和锁InnoDB
    从一个死锁看mysql innodb的锁机制
    Git如何删除自己创建的项目
    公众号的坑
    字符串转Unicode码
    字符串转UTF-8码(%开头)
    git介绍和使用
    ng2中文文档地址
    两个数组的排序方法
  • 原文地址:https://www.cnblogs.com/lsfv/p/5563392.html
Copyright © 2011-2022 走看看