Basically, because the compiler has some choices to make and clearly they've made different choices. Gaps get left inside structs so that accessing the members is more convenient (i.e faster) depending on the processor.
As you can see, on windows (first example) every member has been given eight bytes to itself, but on the Linux the short and the char are sharing eight bytes between them. I would expect the processor to fetch eight bytes at a time, so there's no performance loss here (in fact, it might even be a performance improvement; when you fetch the short, you're also fetching the char, so if you need the short and the char in quick succession, you've saved yourself an extra fetch there).
You might be interested in having a closer look inside with Clang:
http://eli.thegreenplace.net/2012/12/17/dumping-a-c-objects-memory-layout-with-clang/
In the second case, where you have specifically requested packing on a 4 byte boundary, you can see that the windows has done what you asked; 8 bytes for the double, 4 bytes for the short, 4 bytes for the char. The Linux does the same, but continues to have the char and the short share a (4 byte) space. It's the same approach as previously, done in 4 byte lumps.
Basically, the answer is because the Linux compiler here makes the short and the char share a lump of memory (be it 8 bytes or 4), and the Windows compiler makes a different choice and gives them separate lumps of memory.