研究C++的一个编译开关:-d1reportAllClassLayout

编译开关:-d1reportAllClassLayout
[color=#FF0000]注意:-d1,这里的是数字“1”,而不是小写的“L”。[/color]汗,我自己就犯了这个错误,老是被忽略掉,而不起作用!

另外,不是自己生成一个文件,在控制台编译时,他直接输出在了控制台窗口。所以在控制台编译时,我使用了重定位到文件:


E:\Programming\c_cpp>cl classA.cpp -d1reportAllClassLayout > class.layout
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.


E:\Programming\c_cpp>

这个开关的作用是:

它可以让 MSVC 编译器(译注:至少是 MSVC 6.0 以上的版本)生成一个.layout 文件,在该文件中包含有大量的极具价值的类的布局信息,包括基类在派生类中的位置,虚函数表,虚基类表(virtual base class table),类的成员变量等信息.

以下面的代码生成示例如下:


#include
using namespace std;

class A{
  private:
    int a,b;
    char ch;
    
  public:
    A(){
      cout<<"调用构造函数\n";
      a=2;
      b=3;
    }
    ~A(){
      cout<<"调用析构函数\n";
    }
    
    void display(){
      cout<<"a+b="<    }
};
  
int main(){
  A a;
  a.display();
  
  return 0;
}

生成的信息大致格式如下(其中属于系统调用的,我已经删除了,太多了):


class A  size(12):
  +---
0  | a
4  | b
8  | ch
    | <alignment member> (size=3)
  +---

发表评论