-
-
[脚印]2011年25周(6.24) C++内存结构
-
发表于:
2011-6-23 21:36
10811
-
[脚印]2011年25周(6.24) C++内存结构
声明: 内容都是书上的,自己重写下,加深下印象,如有不妥请指出。
参数书籍信息:
<<高质量C/C++>> 第三版 第12章C++面向对象程序设计 电子工业出版社
<<深度探索C++对象模型>> 第1章关于对象 华中科技大学出版社
先看下简单类的代码和数据放置的位置
int CAnimal::m_snType = 0x12345678;
int _tmain(int argc, _TCHAR* argv[])
{
CAnimal AnimalObj;
CAnimal *lpObj = &AnimalObj;
printf("%d,%s", lpObj->m_snType, lpObj->m_szName);
return 0;
}
class CAnimal
{
public:
CAnimal()
{
strncpy(m_szName, "Test!", sizeof(m_szName));
01322453 mov esi,esp
01322455 push 0Ah
01322457 push offset string "Test!" (13279B0h)
0132245C mov eax,dword ptr [this]
0132245F push eax
01322460 call dword ptr [__imp__strncpy (132B3B4h)] }
~CAnimal()
{
_asm NOP
00AD210C nop
printf("%d,%s", lpObj->m_snType, lpObj->m_szName);
013248E6 mov esi,esp
013248E8 mov eax,dword ptr [ebp-20h] //指针保存的就是类的首址(这里也就字符串的地址)
013248EB push eax
013248EC mov ecx,dword ptr [CAnimal::m_snType (132A00Ch)] //(常量区)至少不再栈中
013248F2 push ecx
013248F3 push offset string "%d,%s" (132783Ch)
013248F8 call dword ptr [__imp__printf (132B3ACh)]
virtual ~CAnimal()
virtual bool isCanSay(){}
static bool isCanFly(){}
main函数中,这次不用指针在保存对象
CAnimal AnimalObj;
AnimalObj.isCanSay();
AnimalObj.isCanFly();
printf("class大小:%d ,%d,%s", sizeof(AnimalObj), AnimalObj.m_snType, AnimalObj.m_szName);
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)