Determine the layout of C and C++ types, including their size, and the size, offset, and padding of each field in the type.
The layout
utility uses libclang to generate a C or C++ file with calls to
sizeof
and offsetof
that can be used with a specific compiler to understand the
layout of a given type.o
Suppose we have the following C++ struct defined in a file named test.cpp
:
struct Type;
struct String;
struct Method;
struct Array;
struct EventInfo
{
Type* declaringType;
Type* reflectedType;
String* name;
Method* addMethod;
Method* removeMethod;
Method* raiseMethod;
int eventAttributes;
Array* otherMethods;
};
Then we can run layout
like this:
$ layout test.cpp | g++ -xc++ -;./a.out
EventInfo (64b):
Field | Type | Offset | Size | Padding
declaringType | Type * | 0 | 8 | 0
reflectedType | Type * | 8 | 8 | 0
name | String * | 16 | 8 | 0
addMethod | Method * | 24 | 8 | 0
removeMethod | Method * | 32 | 8 | 0
raiseMethod | Method * | 40 | 8 | 0
eventAttributes | int | 48 | 4 | 4
otherMethods | Array * | 56 | 8 | 0
The layout
utility depends on libclang. It uses CMake and Ninja to build.
$ sudo apt-get install -y llvm-9-dev libclang-9-dev cmake ninja-build
$ ./build.sh
This source code is licensed under the MIT License.