实例代码(栈地址增长方向、vtable对类size的影响、对象最小size概念、结构体对齐规则(对齐参数)、sizeof(指针),free与delete的区别)
2012-12-23 00:04
816 查看
测试代码:
1、栈上局部变量地址增长方向测试(输出中局部变量地址是否连续性,与编译器有关)。
2、vtable在类中size的作用,对象最小size概念(one bite)。
3、关于结构体对齐的问题。(可以设置结构体是否对齐,除了__attribute还有#param参数;结构体对齐的原则,从编译器默认对齐的字节数与结构体各成员中最大对齐字节数两者中,选择较小的一个。
4、一段代码中的连续分配的堆上内存,地址不一定是连续的,可能无规律。
5、sizeof(pType)得到是指针的大小(机器字)
打印输出:
dst--0xbf8a0215 src--0xbf8a021a
dst--123456789 src--6789
pfirst:0x9813008 psecond:0x9813018, sizeof(pfirst):4
A() this:0x9813018
pA:0x9813018 sizeA:8 sizeof(pA):4 pB:0x9813008 sizeB:1
pC:0x9813028 sizeC:16 ,sizeof(pc):4 pD:0x9813040, sizeD:13
~A() this:0x9813018
A() this:0x9813008
A() this:0x981302c
A() this:0x9813034
pA:0x9813008 sizeA:8 sizeof(pA):4 pB:0x9813044 sizeB:1
pAs:0x981302c ,sizeof(pAs):4
~A() this:0x9813034
~A() this:0x981302c
1、栈上局部变量地址增长方向测试(输出中局部变量地址是否连续性,与编译器有关)。
2、vtable在类中size的作用,对象最小size概念(one bite)。
3、关于结构体对齐的问题。(可以设置结构体是否对齐,除了__attribute还有#param参数;结构体对齐的原则,从编译器默认对齐的字节数与结构体各成员中最大对齐字节数两者中,选择较小的一个。
4、一段代码中的连续分配的堆上内存,地址不一定是连续的,可能无规律。
5、sizeof(pType)得到是指针的大小(机器字)
#include <stdio.h> #include <string> class A { public: A() { printf("A() this:%p\n", this); } virtual ~A() { printf("~A() this:%p\n", this); } private: char testbit; }; struct B { public: B(){}; ~B(){}; }; struct C { char testbit; int testInt; double testdouble; }; struct D { char testbit; int testint; double testdouble; }__attribute((packed)); int main () { { char src[]="123456789"; char dst[]="1234"; printf("dst--%p src--%p\n",dst,src); strcpy(dst, src); printf("dst--%s src--%s\n",dst,src); } { char *pfirst = new char[7]; char *psecond = new char[6]; printf("pfirst:%p psecond:%p, sizeof(pfirst):%d\n", pfirst, psecond, sizeof(pfirst)); delete pfirst; delete psecond; } { A *pA = new A; B *pB = new B; C *pC = new C; D *pD = new D; printf("pA:%p sizeA:%d sizeof(pA):%d pB:%p sizeB:%d\n",pA, sizeof(A), sizeof(pA), pB, sizeof(B)); printf("pC:%p sizeC:%d ,sizeof(pc):%d pD:%p, sizeD:%d\n", pC, sizeof(C), sizeof(pC), pD, sizeof(D)); delete pA,pA = 0; delete pB,pB = 0; delete pC,pC = 0; delete pD,pD = 0; pB = new B[10]; pA = new A; A *pAs = new A[2]; printf("pA:%p sizeA:%d sizeof(pA):%d pB:%p sizeB:%d\n",pA, sizeof(A), sizeof(pA), pB, sizeof(B)); printf("pAs:%p ,sizeof(pAs):%d \n", pAs, sizeof(pAs)); delete[] pB,pB = 0; free(pA);//horror delete[] pAs; } return 0; }
打印输出:
dst--0xbf8a0215 src--0xbf8a021a
dst--123456789 src--6789
pfirst:0x9813008 psecond:0x9813018, sizeof(pfirst):4
A() this:0x9813018
pA:0x9813018 sizeA:8 sizeof(pA):4 pB:0x9813008 sizeB:1
pC:0x9813028 sizeC:16 ,sizeof(pc):4 pD:0x9813040, sizeD:13
~A() this:0x9813018
A() this:0x9813008
A() this:0x981302c
A() this:0x9813034
pA:0x9813008 sizeA:8 sizeof(pA):4 pB:0x9813044 sizeB:1
pAs:0x981302c ,sizeof(pAs):4
~A() this:0x9813034
~A() this:0x981302c
相关文章推荐
- C数组名与指针,sizeof与strlen,free与delete区别,野指针,编译过程简介
- new/delete和malloc/free的区别,sizeof的理解和struct内存对齐
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析 .
- c/c++ 复习基础要点01-const指针、指针函数 函数指针、new/delete与malloc/free区别与联系
- c++之this指针做参数实现对象间的交互实例
- 详解C++中指针(*)、取地址(&)、解引用(*)与引用(&)的区别 (完整代码)
- 详解C++中指针(*)、取地址(&)、解引用(*)与引用(&)的区别 (完整代码)
- C++学习之旅——结构体和联合体的区别,以及数据对齐方式影响内存大小
- Mybatis和orcale update语句中接收参数为对象的实例代码
- JS与PHP向函数传递可变参数的区别实例代码
- JS修改地址栏参数实例代码
- 汇编分析参数传递中的地址传递与值传递的区别(指针,引用,值传递)
- 详解C++中指针(*)、取地址(&)、解引用(*)与引用(&)的区别 (完整代码)
- TypedArray实例对象的getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()区别详解
- javascript获取函数名称、函数参数、对象属性名称的代码实例
- new/delete 和malloc/free 的区别(代码部分)
- C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用
- C语言 内存分配 地址 指针 数组 参数 实例解析
- 详解C++中指针(*)、取地址(&)、解引用(*)与引用(&)的区别 (完整代码)
- JS传递对象数组为参数给后端,后端获取的实例代码