struct
, one should arrange the fields based on the size of their types in reverse order. This would typically lead to a more compact struct
which can be crucial to an embedded system with limited memory. To illustrate, struct_a
below is a struct
similar to what I've found in a library provided by a partner of my company. One the other hand, struct_b
is the same struct
but with its fields "properly ordered". In addition, the array arr_a
also appears in similar fashion in the partner's library.Compiling the code above using the GNUARM toolchain and running it the ARM simulator in GDB, we get this output:
#include
struct struct_a {
short f1;
char f2;
int f3;
char f4;
};
struct struct_b {
int f3;
short f1;
char f2;
char f4;
};
struct struct_a arr_a[32];
struct struct_b arr_b[32];
int main() {
printf("sizeof(struct_a):%d\n", sizeof(struct struct_a));
printf("sizeof(struct_b):%d\n", sizeof(struct struct_b));
printf(" sizeof(arr_a):%d\n", sizeof(arr_a));
printf(" sizeof(arr_b):%d\n", sizeof(arr_b));
return 0;
}
Simply by reordering the fields, we could save 4 bytes in the
sizeof(struct_a):12
sizeof(struct_b):8
sizeof(arr_a):384
sizeof(arr_b):256
struct
and 128 bytes from the array above. Another example is given below. Again struct_a
is something found in the library and struct_b
is an optimized version of the struct
.The output of the program compiled through GNUARM toolchain is given below.
#include
struct struct_a {
short f1;
int f2;
char f3;
char f4;
short f5;
char f6;
short f7;
short f8[3];
};
struct struct_b {
int f2;
short f8[3];
short f1;
short f7;
short f5;
char f3;
char f4;
char f6;
};
struct struct_a arr_a[32];
struct struct_b arr_b[32];
int main() {
printf("sizeof(struct_a):%d\n", sizeof(struct struct_a));
printf("sizeof(struct_b):%d\n", sizeof(struct struct_b));
printf(" sizeof(arr_a):%d\n", sizeof(arr_a));
printf(" sizeof(arr_b):%d\n", sizeof(arr_b));
return 0;
}
sizeof(struct_a):24
sizeof(struct_b):20
sizeof(arr_a):768
sizeof(arr_b):640
Again, we could save 4 bytes from the
struct
and 128 bytes from the array. Note that struct_b
above has a short
array with 3 elements as a field. Why it was not made the first field of struct_b
? After all it is bigger than an int
. It has something to do with int
alignment on ARM. Try it out and see.