Alignment is about where something starts. The short b must start on a 2-byte boundary, so an extra byte is added after a.
Try the following code with and without the pragma. As laserlight said, it's compiler dependent how to pack a struct, but this method may work for you. laserlight also mentioned rearranging the elements, which is probably more portable.
Code:
#include <stdio.h>
//#pragma pack (1)
typedef struct _test
{
unsigned char a;
unsigned short b; // 2 bytes
unsigned char c : 4;
unsigned char d : 4;
unsigned char e : 2;
unsigned char f : 6;
}test;
int main() {
test t = {1,2,3,4,1,2};
*(&t.a + 1) = 255;
printf("%d %d %d %d %d %d %d\n", t.a, *(&t.a+1), t.b, t.c, t.d, t.e, t.f);
return 0;
}