• C/C++内存详解


           众所周知,堆和栈是数据结构中的两种数据结构类型,堆是一种具有优先顺序的完全二叉树(或者说是一种优先队列,因为它在一定的优先顺序下满足队列先进先出的特点),排队打饭就是它的典型实例,栈是一种后进先出的数据结构,串糖葫芦和吃糖葫芦完美的诠释了栈的本质。但本文想要说的并不是这种堆和栈,而是内存中的

            C/C++ 之所以屹立不倒,是因为它可以接触系统底层,可以访问内存就是其中的一个重要标志。这种得天独厚的优势是其它语言所望尘莫及的。

            内存中的堆和栈是不同于数据结构中的堆和栈的,内存中的栈区处于相对较高的地址,以地址的增长方向为上的话,栈地址是向下增长的。这是计算机中的堆栈分配图解:

            

            程序员所定义的局部变量都在栈区,自由申请的内存空间都在堆区,常量和全局变量都在静态区。对一个程序员来说栈区是最方便的,堆区是最自由的,因为程序员在堆区可以自由分配内存空间。下面用实例说明:

            

            这里的data变量是被分配在栈区的,因为它是局部变量,并且是系统自动分配的,Int类型默认4个字节。


            

            这里的info和data变量是被放在堆区的,但是这里程序员并没有利用malloc函数动态为他分配指定内存

    所以依然占用默认int类型默认空间-4个字节。

            

            这里的data变量是被放在堆区的,而且程序员利用malloc函数动态为它分配了100字节大小的空间,后面也用_msize()函数验证了这一点。有的人可能对malloc函数的使用方法不太清楚,这里给解释一下:

            因为malloc函数返回的是一个void*指针变量,而C/C++规定,void*指针变量可以强制转换为其他任意指针类型,故有了以上的写法。


    再给大家看一个程序


            第一行输出的是一个地址,因为malloc函数返回的是void类型的指针变量

            第二行输出的是8,因为我的机子是64位的,在64位系统中,指针变量所占用的内存为8个字节

            第三行输出的是4,因为int类型指针指向的一定是int类型变量,而int类型变量所占用的内存为4个字节,需要注意的是,sizeof(任意类型指针变量)所求出的并不是你定义的变量所占用的内存大小,而是和该指针同类型的变量所占用的内存大小。

            第四行输出的是100,这或许就是你第三行的疑惑------你定义的变量所占用的内存大小!!!,你们一定要记注这个函数哟,它叫_msize,在<malloc.h>头文件中。



            


  • 相关阅读:
    如何突破单库性能瓶颈?
    高性能数据库表该如何设计?
    高性能索引该如何设计?(下)
    高性能索引该如何设计?(上)
    MySQL体系结构与存储引擎
    动态ViewPager导航页面
    ViewPager图片轮转带点的
    手动图片横向轮播
    安卓布局中下拉列表框的实现
    安卓中adapter的应用
  • 原文地址:https://www.cnblogs.com/viplanyue/p/12700727.html
Copyright © 2020-2023  润新知