#include <typeinfo>
#include <iostream>
#include <vector>
#include <stdint.h>
#include "SortedPointerVector.h"
using namespace
std;
typedef uint32_t
PartPosition;
typedef uint32_t
PartDataLength;
typedef uint16_t
PartNumber;
typedef uint32_t
PartSize;
typedef uint16_t
FieldPosition;
typedef uint16_t
FieldDataLength;
typedef uint32_t
FieldListLength;
typedef uint32_t
FieldListPosition;
typedef int16_t
Fid;
typedef uint8_t
FieldType;
struct Struct1
// 8
{
double d; // 8
};
struct Struct2
// 4
{
int i; // 4
};
struct Struct3
// 2
{
short s; // 2
};
struct Struct4
// 1
{
bool b; // 1
};
struct Struct5
// 8
{
char * c; // 8
};
struct Struct11 // 16
{
bool b; // 1
short s; // 2
int i; // 4
double d; // 8
};
struct Struct12 // 16
{
double d; // 8
int i; // 4
short s; // 2
bool b; // 1
};
struct Struct13 // 24
{
int i; // 4
double d; // 8
short s; // 2
bool b; // 1
};
struct Struct14 // 24
{
bool b; // 1
double d; // 8
short s; // 2
int i; // 4
};
struct Struct21 // 8
{
char c[8]; // 8
};
struct Struct22 // 9
{
char c[9]; // 9
};
struct Struct23
// 17
{
char c1[9];
char c2[8];
};
struct Struct24
// 24, because 8,1,8
{
char c1[9];
double d;
};
struct Struct25
// 16, because 8,2
{
double d; // 8
char c[2]; // 2
};
struct Struct26
// 16, because 8,2
{
char c[2]; // 2
double d; // 8
};
struct Struct27 // 8
{
int i; // 4
char c[2]; // 2
};
struct Struct28 // 8
{
char c[2]; // 2
int i; // 4
};
struct Struct31
// 34, because 17+17
{
Struct23 s1; // 17
Struct23 s2; // 17
};
struct Struct33 // 48
{
Struct24 s1; // 24 (8,1,8)
Struct24 s2; // 24 (8,1,8)
};
struct Struct34 // 24, because
8,2,2,8
{
Struct25 s1; // 16 (8,2)
Struct26 s2; // 16 (2,8)
};
struct Struct35
// 24, because (16,1),4, align 4
{
Struct23 s1; // 17
int i; // 4
};
struct Struct36
// 28, because (16,1),4,1+1+1, align 4
{
Struct23 s1; // 17
int i; // 4
bool b1; // 1
bool b2; // 1
bool b3; // 1
};
struct Struct37
// 28, because (16,1),4,1+1+1+1, align 4
{
Struct23 s1; // 17
int i; // 4
bool b1; // 1
bool b2; // 1
bool b3; // 1
bool b4; // 1
};
struct Struct38
// 32, because (16,1),4,1+1+1+1,1, align 4
{
Struct23 s1; // 17
int i; // 4
bool b1; // 1
bool b2; // 1
bool b3; // 1
bool b4; // 1
bool b5; // 1
};
struct Struct39
// 40, because (8,8,1),8,1+1+1+1+1, align 8
{
Struct23 s1; // 17
double d; // 8
bool b1; // 1
bool b2; // 1
bool b3; // 1
bool b4; // 1
bool b5; // 1
};
struct Struct40
// 16, because 4,2,2,4, align 4
{
Struct27 s1; // 4,2
Struct28 s2; // 2,4
};
struct InstrumentName // 65
{
static const uint64_t INSTRUMENT_NAME_LENGTH = 64;
char name[INSTRUMENT_NAME_LENGTH]; // 64
uint8_t size; // 1
};
struct InstrumentNameWrapper1
// 65
{
InstrumentName
n; // 65
};
struct InstrumentNameWrapper2
// 66, align 1
{
InstrumentName
n; // 65
bool b; // 1
};
struct InstrumentNameWrapper3
// 72, because 64,1,4, align 4
{
InstrumentName
n; // 65
int i; // 4
};
struct InstrumentKey
// 72, because 64,1,2,2,1+1, align 2
{
InstrumentName
name; // 65 (64+1)
uint16_t domain; // 2
uint16_t serviceID; //
2
uint8_t nameType; // 1
uint8_t qos; // 1
};
struct InstrumentKey2
// 70, 2,2,66, align 2
{
uint16_t domain; // 2
uint16_t serviceID; //
2
InstrumentName
name; // 65 (64+1)
uint8_t nameTypeQos; //
1
};
struct ConstituentKey
// 1
{
uint8_t constituentNumber;
};
struct PartSizes
// 32
{
std::vector<std::pair<PartNumber, PartSize>>
contents;
};
struct PartDatas
// 48, because 8,4,32, align 8
{
char * data; // 8
PartDataLength dataLength; // 4
PartSizes partSizes; // 32
};
struct ConstituentData
// 72, because 48,4+4,1+2+2+1+1+1,1+1, align 8
{
PartDatas partDatas; // 48,
align 8
uint32_t pe; // 4
uint32_t mask;
// 4
ConstituentKey key; // 1
PartNumber lastPartNumber; // 2
int16_t fieldListNumber; // 2
uint8_t instrumentType; //
1
bool isLastPartNumberKnown; // 1
bool hasMultipleParts; // 1
bool hasPE; // 1
bool isContainShellMetaData; //
1
};
struct ConstituentData2
// 64, because 48,4+2+2,2+1+1+1+1+1+1, align 8
{
PartDatas partDatas; // 48,
align 8
uint32_t mask;
// 4
uint16_t pe; // 2
PartNumber lastPartNumber; // 2
int16_t fieldListNumber; // 2
ConstituentKey key; // 1
uint8_t instrumentType; //
1
bool isLastPartNumberKnown; // 1
bool hasMultipleParts; // 1
bool hasPE; // 1
bool isContainShellMetaData; //
1
};
typedef SortedPointerVector<ConstituentKey, ConstituentData>
ConstituentDataList; // 40
struct InstrumentContentData
// 72, because 1+1+4,8,8,40,8
{
uint8_t ll2Type; // 1
bool isEverInstrumentAvailable; // 1
uint32_t instrumentId; //
4
int64_t lastUpdateTickCountInNanosec; // 8
InstrumentKey * underlyingKey; // 8
ConstituentDataList constituentDataList; // 40
uint32_t mcLabel; // 4
};
struct InstrumentContentData2
// 64, because 40,8,8,4+2+1+1
{
ConstituentDataList constituentDataList; // 40
int64_t lastUpdateTickCountInNanosec; // 8
InstrumentKey * underlyingKey; // 8
uint32_t instrumentId; //
4
uint16_t mcLabel; // 2
uint8_t ll2Type; // 1
bool isEverInstrumentAvailable; // 1
};
//-----------------------------------------------------------
template <class
T>
void printSize()
{
cout
<< typeid(T).name() << " : " << sizeof(T)
<< endl;
}
int main()
{
cout
<< "primitive 1" << endl;
printSize<Struct1>();
printSize<Struct2>();
printSize<Struct3>();
printSize<Struct4>();
printSize<Struct5>();
cout
<< "struct 11" << endl;
printSize<Struct11>();
printSize<Struct12>();
printSize<Struct13>();
printSize<Struct14>();
cout
<< "array 21" << endl;
printSize<Struct21>();
printSize<Struct22>();
printSize<Struct23>();
printSize<Struct24>();
printSize<Struct25>();
printSize<Struct26>();
printSize<Struct27>();
printSize<Struct28>();
cout
<< "compund 31" << endl;
printSize<Struct31>();
printSize<Struct33>();
printSize<Struct34>();
printSize<Struct35>();
printSize<Struct36>();
printSize<Struct37>();
printSize<Struct38>();
printSize<Struct39>();
printSize<Struct40>();
cout
<< "real" << endl;
printSize<InstrumentName>();
printSize<InstrumentKey>();
printSize<ConstituentDataList>();
printSize<InstrumentContentData>();
cout
<< "real 2" << endl;
printSize<ConstituentData>();
printSize<PartDatas>();
printSize<PartSizes>();
cout
<< "real modified" << endl;
printSize<InstrumentNameWrapper1>();
printSize<InstrumentNameWrapper2>();
printSize<InstrumentNameWrapper3>();
printSize<InstrumentContentData2>();
// saved 8 bytes
printSize<ConstituentData2>(); // saved 8
bytes
printSize<InstrumentKey2>(); //
saved 2 bytes
system("PAUSE");
}