Из-за выравнивания. Компиляторы x86 склонны выравнивать типы int на границе 4 байта (для более быстрого доступа к памяти), поэтому CHaraICICCC, вероятно, будет выглядеть так:
byte 0: \
byte 1: | <--- int i
byte 2: |
byte 3: /
byte 4: <----- char c1
byte 5: \
byte 6: | <--- Padding (wasted bytes)
byte 7: /
byte 8: \
byte 9: | <--- int j
byte 10: |
byte 11: /
byte 12: <----- char c2
byte 13: <----- char c3
byte 14: <----- char c4
всего 15 байтов, в то время как CHaraIICCCC будет:
byte 0: \
byte 1: | <--- int i
byte 2: |
byte 3: /
byte 4: \
byte 5: | <--- int j
byte 6: |
byte 7: /
byte 8: <----- char c1
byte 9: <----- char c2
byte 10: <----- char c3
byte 11: <----- char c4
всего 12 байт (без байтов, потраченных на заполнение). Конечно, это сильно связано с компилятором и зависит от ваших параметров компиляции.