MSVC的 未公开开关d1reportAllClassLayout

 

在看雪学院的 <<逆向C++>>一文中偶尔看到说VC6.0 以上的编译器支持一个d1reportAllClassLayout的开关, 可以输出所有对象的内存布局信息, 心想我不知道多少次查看过 cl /?的输出, 没印象这个玩艺儿呀, 打开cmd窗口, 弄了个例子程序, 一试不爽.
小例子程序如下:

struct Foo
{
        int i;
        char c;
};
int main()
{
        Foo f;
        f.i = 5;
        return 0;
}

这个开关输出了包括Foo结构在内, 主要是一大堆编译器内部的结构的内存布局, 其实还有一个开关是
d1reportSingleClassLayout
用起来是这样:
cl -d1reportSingleClassLayoutFoo test.cpp
切切注意, Layout跟指定的结构/类名Foo之间没有空格, 有空格就不对了. 这会只输出指定的结构的内存布局.

遗憾的是, 不能多次指定 -d1reportSingleClassLayout以输出多个自定义的结构的内存布局. 而且也不支持通配符*之类.

在google里搜了一下, msvc hidden switch, 本想顺藤摸瓜找出MSVC支持的所有隐藏开关, 没发现什么其它的.

在VS测试小组
Andy Rich的blog中, 说这样的选项未经公布, 也没做测试, 使用者责任自负. 呵呵, 这是当然. 不论如何, 有这个总比没有好.

下面看看对包含了虚函数的类的输出:




class Foo
{
    public:
    int i;
    virtual void foo();
    char c;
};

void Foo::foo()
{
}
int main()
{
    Foo f;
    f.i = 5;
    return 0;
}

输出是:


不光给出了对象布局开关处的vfptr指针, 而且连带的输出了Foo对象的vtable. 最后的那个this adjustor是什么? 估计是多重继承时如何调整this指针的一个偏移量. 放在这, 估计日后用得着.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值