用VS2010查看类的内存布局,这里用两种方法
(1)MSVC有个隐藏的“/d1”开关,通过这个开关可以查看项目中类的内存布局情况。
修改项目属性,添加”/d1 reportSingleClassLayoutCC”开关,表示需要查看类CC的内存布局。
/d1 reportAllClassLayout 是查看所有类的布局,这样编译后会在输出界面上输出很多类的布局
/d1 reportSingleClassLayoutXX,"XX"是填入你想查看的类的名字,编译后会在输出界面上输出类的布局,任何匹配它的类名都会被输出。比如想看class A,你输入了/d1reportSingleClassLayoutA,但是你会发现会编译器输出很多无关的类,如struct ABC、Class inAttribute Class dbA...因为它们的类名都包含有A这个字母。
(2)通过添加自定义的外部工具,将类的内存布局在cmd界面上打印出来
1、首先新建一个bat文件,可以命名为classlayout.bat,保存在VC++的目录下,就是调用了下cl.exe而已
@echo off call "%VS120COMNTOOLS%vsvars32.bat" if "%2" == "" goto error if "%1" == "" goto error cl.exe /nologo /w /Zs /d1reportSingleClassLayout%2 %1 goto :eof :error echo Error:参数错误 - 是否划定了类名? goto :eof
2、然后新建一个cpp文件,会创建通道并创建子进程执行批处理。然后捕获批处理的标准输出,并过滤内容,只输出想要的。。。
#include <iostream> #include <fstream> #include <string> #include <windows.h> using namespace std; char g_name[101] = {}; bool CMDLine(char* cmd) { SECURITY_ATTRIBUTES sa; HANDLE hRead,hWrite; sa.nLength=sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; if (!CreatePipe(&hRead, &hWrite, &sa, 0)) { cout << "CreatePipe失败" << endl; return false; } STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); ZeroMemory(&pi, sizeof(pi)); si.cb = sizeof(STARTUPINFO); GetStartupInfo(&si); si.hStdError = hWrite; si.hStdOutput = hWrite; si.wShowWindow = SW_HIDE; si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; if (!CreateProcess(NULL,cmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) { cout << "CreateProcess失败" << endl; return false; } CloseHandle(hWrite); char buffer[128] = { 0 }; DWORD bytesRead; bool bFindIt = false; bool bFindEnd = false; char *pBegin = NULL; char *pError = NULL; //// ofstream ofile("c:\out2.txt", ios_base::binary); cout << "Waiting..." << endl; //WaitForSingleObject(hRead,INFINITE); while (ReadFile(hRead, (LPVOID)&buffer, 127, &bytesRead, NULL)) { buffer[bytesRead] = '