今天看了一下《C++应用程序性能优化》一书,看完了第一章,感觉挺不错的,有点相见恨晚的感觉。刚开始学C++的时候,我几乎不对内存进行直接操作,连指针都尽量避开。因为这些东西确实挺复杂的。学了汇编以及一些硬件的知识之后,感觉自己在这个层次上有一点提升了,就想着去了解一下C++更深层次的一些东西。
首先困扰我的就是类和结构体的内存分配问题,经过了那么久的学习,总算感觉有些懂了,在这里做点笔记。
分析一下下面段C++代码:
#include "stdio.h"
int g_global;
class A
{
public:
int a;
A(){};
virtual ~A(){printf("A is free/n");};
};
class B
{
public:
int b;
B(){};
virtual ~B(){printf("B is free/n");};
};
class C:public A,B
{
public:
int c;
static int d;
C(){};
virtual ~C(){printf("C is free/n");};
};
void main()
{
static int s_val0;
char* str = "ok";
int val;
A a;
B b;
C c;
printf("---------val memory-----------/n");
printf("g_global address:%d/n",&g_global);
printf("s_val0 address:%d/n",&s_val0);
printf("str address:%d/n",str);
printf("str val address:%d/n",&str);
printf("val address:%d/n/n",&val);
printf("--------class memory----------/n");
printf("sizeof A:%d/n",sizeof(A));
printf("sizeof B:%d/n",sizeof(B));
printf("sizeof C:%d/n/n",sizeof(C));
}
输出结果为:
由该果可以看出:全局变量、静态变量(包括类静态成员)存储在全局存储区,字符串存储在全局字符区(区分全局存储区),局部变量存储在栈中。
类的静态成员不算在类的总存储区内,C从表A、B两个父类继承过来两个虚函数表。C的大小为A+B+C自己的存储区大小。