The article is since 2001 but I will answer anyway.
Take for example this code:
struct Packaging {
char c;
int i;
} Packaging;
sizeof(Packaging) will be 8 Bytes.
or you could do:
#pragma pack(push)
#pragma pack(1)
struct Packaging {
char c;
int i;
} Packaging;
#pragma pack(pop)
sizeof(Packaging) will be 5 Bytes because of aliasing.
We can use __attribute__ instead of #pragma, like this:
struct Packaging {
char c;
int i;
} __attribute__((packed)) Packaging;
It will have the same effect as pragma.
And there are a lot of other uses for __attribute__.