用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] = '\0';
////// ofile << "Block:\n";
//// ofile << (char*)buffer;
//// continue; if(pError = strstr(buffer, "error C")) //输出错误
{
char *pReturn = strstr(pError, "\r");
if(pReturn)
{
*pReturn = '\n';
*(pReturn+1) = '\0';
}
cout << pError << (pReturn?"":"\n");
continue;
} if(!bFindIt && (pBegin = strstr(buffer, g_name)))
{
system("cls");
bFindIt = true; char *pEnd = strstr(pBegin, "\r\n\r\n\r\n"); //每个class间至少3个
if(pEnd)
{
*(pEnd+6) = '\0';
bFindEnd = true;
} cout << "class" << pBegin;
continue;
} if(bFindIt && !bFindEnd)
{
char *pEnd = strstr(buffer, "\r\n\r\n\r\n");
if(pEnd)
{
*(pEnd+6) = '\0';
bFindEnd = true;
} cout << (char*)buffer;
}
} //// ofile.close();
if(false == bFindIt)
cout << "\n未找到class" << g_name << endl << endl; return true;
} int main(int argc, char*argv[])
{
if(argc != 3)
goto end; cout << argv[1] << endl;
cout << argv[2] << endl; char *cppPath = argv[1];
while(*cppPath)
cppPath++;
if(cppPath - argv[1] < 5 || _strnicmp(cppPath-4, ".cpp", 4))
goto end;
if(*argv[2] == '\0')
goto end;
else
_snprintf(g_name, 100, " %s\t", argv[2]); char cmd[201] = {};
_snprintf(cmd, 200, "D:\\VS2010\\VC\\bin\\classlayout.bat \"%s\" \"%s\"", argv[1], argv[2]); cout<<cmd<<endl;
CMDLine(cmd);
system("pause");
return 0; end:
cout << "error: 输入参数不正确,是否已选中类名?" << endl;
system("pause");
return 0;
}

这里要添加两个system("pause");否则到时候会存在闪退的情况

  1. 里面的ofile用来将所有捕获到的内容输出到文件的,想打开它,取消里面的////注释即可!!!
  2. 里面的_snprintf(g_name, 100, " %s\t", argv[2]),是为了尽可能查找到类名,若改为"class %s\t",有时会找不到,因为ReadFile是按块读取的,两个块有可能从"class %s"中间断开。。。我们这样减小了这种可能,,当然,只是减小而已。
  3. 这也会过滤error warning等
  4. struct的内存布局输出前缀也是"class"
  5. 这里提醒,如果直接复制代码,需要注意代码中的那个路径要改成你电脑上的classlayout.bat文件的路径

3、编译通过后,配置成外部工具,工具->外部工具->添加,命令:找到你的可执行文件,参数如图所示,标题任意。

4、在使用前,确保你要查看的类所在的cpp文件编译通过,使用时,先选中你要查看的类的名字,再在工具中找到你起的名字(classlayout)就可以

注意:

(1)如果你的显示CreateProcess失败,你可以看下你的项目属性中字符集选用的是不是多字节字符集

(2)如果cmd格式不对,应该也是上述设置的问题

VS2010下如何查看类的内存布局的更多相关文章

  1. cl查看类的内存布局

    查看单个类的内存布局 Microsoft Visual Studio编译器cl的编译选项可以查看源文件中某个C++类的内存布局,对于想了解某个对象的内存布局的人来说十分直观和方便. • 命令格式    ...

  2. [CPP] 类的内存布局

    本文可以解决下面 3 个问题: 以不同方式继承之后,类的成员变量是如何分布的? 虚函数表及虚函数表指针,在可执行文件中的位置? 单一继承.多继承.虚拟继承之后,类的虚函数表的内容是如何变化的? 在这里 ...

  3. 继承虚函数浅谈 c++ 类,继承类,有虚函数的类,虚拟继承的类的内存布局,使用vs2010打印布局结果。

    本文笔者在青岛逛街的时候突然想到的...最近就有想写几篇关于继承虚函数的笔记,所以回家到之后就奋笔疾书的写出来发布了 应用sizeof函数求类巨细这个问题在很多面试,口试题中很轻易考,而涉及到类的时候 ...

  4. c++类的内存布局

    问题: 考察了reinterpret_cast和static_cast的区别.顺道发现了一个可以查看c++内存布局的工具(在VS中). 结果: 前两个输出的地址形同,后一个不同. class A{in ...

  5. 使用sos查看.NET对象内存布局

    前面我们图解了.NET里各种对象的内存布局,我们再来从调试器和clr源码的角度来看一下对象的内存布局.我写了一个测试程序来加深对.net对象内存布局的了解: using System; using S ...

  6. c++中如何查看一个类的内存布局

    打开VS command prompt,输入下述命令可以看到对象的内存布局. cl a.cpp -d1 reportSingleClassLayout[classname] //  reportSin ...

  7. C++类继承内存布局(一)

    转自:http://blog.csdn.net/jiangyi711/article/details/4890889# 一 类布局 不同的继承方式将导致不同的内存布局 1)C结构 C++基于C,所以C ...

  8. 【C++对象模型】使用gcc、clang和VC++显示C++类的内存布局

    引言 各种C++实现对C++类/对象的内存布局可能有所不同,包括数据成员的顺序.虚函数表(virtual table: vtbl)的结构.继承关系的处理等.了解C++类/对象的布局,对于理解C++各种 ...

  9. C++类继承内存布局(三)

    参考:http://blog.csdn.net/jiangyi711/article/details/4890889# (三)成员函数 类X中每一个非静态成员函数都会接受一个特殊的隐藏参数——this ...

随机推荐

  1. Windows+.Net Framework+svn+IIS在Jenkins上的自动化部署入门

    关于Jenkins的使用及安装,上一篇文章我已经介绍过了,Windows+.NetCore+git+IIS在Jenkins上的自动化部署入门.这篇主要是在jenkins如何安装SVN和MSBuild. ...

  2. 5V充12.6V三节锂电池,5V升压12.6V的电路图

    三串锂电池的充电电压是三串锂电池的最高电压值,就是12.6V了.5V充12.6V是5V给三串锂电池充电.如笔记本的USB口5V给三串锂电池充电,如5V的适配器或者手机充电器插上数据线给三串锂电池充电电 ...

  3. docker mysql 设置忽略大小写

    使用docker 安装mysql时  Linux下是默认不忽略大小写,导致操作数据库的时候会报如下错误 为了解决上面的问题,我们在创建MySQL容器的时候就需要初始化配置  lower_case_ta ...

  4. scrapy框架基于管道的持久化存储

    scrapy框架的使用 基于管道的持久化存储的编码流程 在爬虫文件中数据解析 将解析到的数据封装到一个叫做Item类型的对象 将item类型的对象提交给管道 管道负责调用process_item的方法 ...

  5. SpringCloud Alibaba Nacos注册中心源码浅析

    一.前置了解 1.1 简介 Nacos是一款阿里巴巴推出的一款微服务发现.配置管理框架.我们本次对将对它的服务注册发现功能进行简单源码分析. 1.2 流程 Nacos的分析分为两部分,一部分是我们的客 ...

  6. JMeter性能测试9:阿里云服务器压测

    第一步准备好jmeter脚本 第二步 将本地的jmeter脚本上传到阿里云进行验证 检验阿里云的jmeter是否能正常运行 将本地的脚本上传到阿里云使用xshell进入到该目录下 使用命令运行刚才上传 ...

  7. vercel是什么神仙网站?

    Vercel? vercel是我用过的最好用的网站托管服务.本网站就是基于hexo引擎模板开发,托管在vercel上的. vercel类似于github page,但远比github page强大,速 ...

  8. shell命令分隔符 二叉树结构的命令行树

    shell命令分隔符 二叉树结构的命令行树 I  ;&

  9. loj10009钓鱼___vector的调试

    题目描述 在一条水平路边,有 n 个钓鱼湖,从左到右编号为1,2,...,n .佳佳有 h 个小时的空余时间,他希望利用这个时间钓到更多的鱼.他从1  出发,向右走,有选择的在一些湖边停留一定的时间( ...

  10. C# 实现一个基于值相等性比较的字典

    C# 实现一个基于值相等性比较的字典 Intro 今天在项目里遇到一个需求,大概是这样的我要比较两个 JSON 字符串是不是相等,JSON 字符串其实是一个 Dictionary<string, ...