标题:C++ 类学习 2(非礼勿视)
只看楼主
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
结帖率:59.52%
 问题点数:0 回复次数:3 
C++ 类学习 2(非礼勿视)
#include "stdafx.h"
#include "Cstock.h"
#include <stdio.h>
#include <stdlib.h>

class Cstock{
private:
    int a,b;
public:
    void function1(int num1,int num2);
    int function2();
};

void Cstock::function1(int num1,int num2)
{
    a=num1;
    b=num2;
}

int Cstock::function2()
{
    printf("function1:%x\n",&Cstock::function1);
    printf("function2:%x\n",&Cstock::function2);
    printf("Cstock addr:%x\n",this);
    printf("Cstock addr:%x\n",*this);
    //printf("Cstock:%x\n",this);
        //printf("bb:%x\n",Cstock);
    printf("a:%x\n",&a);
    printf("b:%x\n",&b);
    printf("\n");
    printf("\n");
    return 0;
}


程序代码:
int _tmain(int argc, _TCHAR* argv[])
{
    Cstock stock1;
    Cstock stock2;
    Cstock stock3;

    //int num;
    printf("1:\n");
    stock1.function1(3,4);
    stock1.function2();
    printf("2:\n");
    stock2.function1(3,4);
    stock2.function2();
    printf("3:\n");
    stock3.function1(3,4);
    stock3.function2();

    printf("stock1:%x\n",&stock1);
    printf("stock2:%x\n",&stock2);
    printf("stock3:%x\n",&stock3);
    getchar();
}


实例运行后得出结果
1:
function1:dc119f
function2:dc1127
Cstock addr:25fc90
Cstock addr:3               -----〉这个地方是值
a:25fc90
b:25fc94


2:
function1:dc119f
function2:dc1127
Cstock addr:25fc80
Cstock addr:3       -----〉这个地方是值
a:25fc80
b:25fc84


3:
function1:dc119f
function2:dc1127
Cstock addr:25fc70
Cstock addr:3    --------〉这个地方是值
a:25fc70
b:25fc74


stock1:25fc90
stock2:25fc80
stock3:25fc70

由上述的测试结果来看可以得出结论
1.this 指针和变量a的地址是一样的,申明的类实例的地址和变量a的地址是一样的 ,都是在调用类实例的函数的栈上,书上this代表调用类方法的当前实例地址,由此可以得知结论:
    区分不同的类实例是靠在内存的不同位置来实现的   内存的位置在调用者的栈上

2.由于类只是一个模板 其最终操作的是数据,  代码部分是由类实例公用的,也就是如果声明了两个类的实例 A和B则 A和B所使用的函数function1和function2的地址是一样的
  只是传入的数据不同而已

3. 一个推论  既然代码部分都是由类的实例公用的,不同的类实例对方法的调用需求不一样,由此可以得出推论  类的代码是全部加载到了内存中的 不管有些方法用不用的上

4. stock1:25fc90
   stock2:25fc80
   stock3:25fc70

    我们的类数据变量总共才2个 2*4=8  而在内存中3个类实例变量是以F为单位的, 如果变量个数为5的时候 需要20个字节,用屁股想他也会给分配32个字节的栈内存,
   此部分可以得出 在内存中是以16的倍数来分配类实列数据内存空间的

5.加载类的方法函数的所有代码,不管有用没有 都加载进去
  栈空间分配粒度为16个字节  虽然这个小小的牺牲了下内存  但它也是内存啊
  牺牲了内存换来了OOP思想  怪不得linux的老大哥炮轰C++
  也怪不得 我运行一个win7 64位的要4GB的内存 ,可我2GB的内存运行linux 64的OK  运行TMD WIN7 32位的还经常出现程序不响应。硬件要求是越来越高,可体验还是老样子上不去
  这个得怪什么呢

6.还未能解决的问题是 栈内存如何和类的公用代码建立的联系,公用代码又是如何被规划安放的

[ 本帖最后由 zhu224039 于 2014-6-13 04:46 编辑 ]
搜索更多相关主题的帖子: public include private 
2014-06-13 04:33
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
C++就别用printf()了 有更好的方法

  也怪不得 我运行一个win7 64位的要4GB的内存 ,可我2GB的内存运行linux 64的OK  运行TMD WIN7 32位的还经常出现程序不响应。硬件要求是越来越高,可体验还是老样子上不去
  这个得怪什么呢


这里关键还是软件渣渣 内核其实占不了多少内存

还有 这里和C++也没啥关系 因为操作系统又不是C++写的
2014-06-15 13:03
Alar30
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:10
帖 子:988
专家分:1627
注 册:2009-9-8
得分:0 
嘿嘿
Z版又跑出来了。。。
2014-06-15 20:23
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
以下是引用Alar30在2014-6-15 20:23:13的发言:

嘿嘿
Z版又跑出来了。。。

2014-06-15 22:37



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-432865-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.109943 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved