例如下面这小段代码
int gItem1=0,gItem2=0;
int gItem3,gItem4;
int main(int argc,*argv[])
{
    static int sItem1 = 0,sItem2 = 0;
    static int sItem3,sItem4;
    int a,b,c;
    char *pstr1 = "this";
    return 0;
}
这小段代码在数据段存储了全局变量和静态变量(包括初始化和未初始化的),在堆栈段存储了局部变量,当然在代码段存储了代码。请问怎么知道都在这3个段中各自占据了多大的内存空间呢?当然在这个例子中可以直接算出来占用的内存大小。这只是个例子,实际中需要统计的代码会很长,很有可能还会有函数相互调用的情况,如果有函数相互调用,堆栈段统计就只在函数内部统计。
如果想要获得某个时刻或执行到某行代码时这3段的使用情况,或其可以使用的起始地址,又怎么实现呢?谢谢~~~
本来想给高点分数,发现我的分数不多,呵呵~高手们望给个方法阿

解决方案 »

  1.   

    编译出来会有的
    在.bss
      .text
      

  2.   

    .bss 是未初始化的
    .data是数据区
      

  3.   

    哦,在VS2008上面~
    那如何从.bss和.data里面得到呢?这两个段都是统计数据的,而且没有局部变量的统计。代码段如何知道?
      

  4.   

    这个需求好特殊
    恐怕用通过汇编才能实现
    没听说过有对应的API
      

  5.   

    是啊,查了几天资料,没发现有用vc实现的,或者有说用vc可以实现的,不过也可能是我查的资料不够~~
    不知用汇编如何实现?
      

  6.   

    在映像文件的节表中找,映像文件是编译后实际存在的文件还是一些中间文件呢?如何查找,有操作函数么,例如FindDataSize之类的函数?这个函数是我乱想出来的,就是指有没有直接获得大小的函数
      

  7.   

    映像文件的节表中找?这个文件是编译后实际存在的还是一些中间文件,编译后会消失的那种?如何从这个文件里面找?有没有比较直观的函数,例如GetDataSize之类获得数据段大小的函数?这个函数不知道存不存在,只是打个比方乱想出来的~
      

  8.   

    你发布出去的只有最终连接的输出文件
    调用GetModuleHandleW(0)得到的是当前exe的内存映像的基地址,解读其中的数据结构即可
      

  9.   

    exe的里面包含了全部的全局变量等情况,不能统计某部分的情况。我现在就是想统计感兴趣的部分,不知道这样如何实现
      

  10.   

    用pragma dataseg把你的全局变量都放在一个专用的节中,然后找这个节的大小你统计这个实在没什么意义
      

  11.   

    为啥都说没意义呢,想想,如果一个工程上百个文件,每个文件所占内存空间不知,现在要将工程移植到非pc平台上跑,移植之前是不是要评估下工程中各个文件占用的内存情况?如果占用过大是不是要优化下工程中的文件?要不然代码就跑飞了~~~
    “用pragma dataseg把你的全局变量都放在一个专用的节中”这种方法只能是编写代码之前用,现在是文件都已经写好了,里面的全局变量、代码空间都是未知的,所以才要统计~~
      

  12.   

    那你要做的不是去看exe里面的东西,而是看各个cpp编译得到的obj文件里面的节的大小
      

  13.   

    obj只能看一个cpp文件的情况,如果想看几个cpp文件的情况,obj也就没法了~~这就是难的地方所在,不一定要看全部,也不一定看单个,可能看几个cpp文件,也可能是看某个cpp文件里面的某些代码~所以,pe文件不行,map文件也不行啊
    我觉得编译器编译的时候,肯定有编译到哪一步然后将这一步的变量、代码量保存下来,就是不知道如何找到保存的地方或地址
      

  14.   

    一个cpp对应一个obj
    你有几个cpp就有几个obj