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 编辑 ]