Я не могу представить себе недостаток первой структуры над второй в данном конкретном случае, но можно привести примеры, когда существуют недостатки в общем правиле, в котором ставятся самые большие члены:
struct A {
int* a;
short b;
A(short num) : b(2*num+1), a(new int[b]) {}
// OOPS, `b` is used uninitialized, and a good compiler will warn.
// The only way to get `b` initialized before `a` is to declare
// it first in the class, or of course we could repeat `2*num+1`.
}
Я также слышал о довольно сложном случае для больших структур, когда у ЦПУ есть режимы быстрой адресации для доступа к указателю + смещению, для небольших значений смещения (например, до 8 бит или некоторого другого пределанепосредственное значение).Лучше всего микрооптимизировать большую структуру, поместив как можно больше наиболее часто используемых полей в диапазон самых быстрых инструкций.
ЦП может даже иметь быструю адресацию для указателя + смещение и указатель + 4 *смещение.Затем предположим, что у вас есть 64 поля char и 64 поля int: если вы сначала поместите поля char, то все поля обоих типов можно будет адресовать с помощью лучших инструкций, тогда как, если вы сначала поместите поля int, то поля char, которые не равны 4к -aligned просто нужно будет обращаться по-другому, возможно, путем загрузки константы в регистр, а не с непосредственным значением, потому что они выходят за пределы ограничения в 256 байт.
Никогда не приходилось делать это самостоятельнонапример, x86 в любом случае допускает большие непосредственные значения.Это не та оптимизация, о которой обычно думают все, если не тратить много времени на сборку.