2015-10-20 4 views
1

Скажем, у меня есть:-структуруЯчейки памяти, и диапазоны

struct guitar{ 
    long guitarID; 
    short brand:3; 
    short strings: 6; 
    short price; 
}x[5][5]; //Thanks chux 

Если адрес х равно 0xaaa и память выравнивается по кратным 4, то, что бы адрес быть х [1]?

Другая вещь, которую я хочу знать, это то, что диапазон чисел между брендом и строками теперь зависит от того, что они пострадали от битового поля?

+0

'... короткая цена; }; x [5] [5] 'является проблемой. '... короткая цена; } x [5] [5]; 'больше смысла. – chux

+0

«память выровнена с кратным 4» и «x is 0xaaa» противоречива, поскольку «0xaaa» не кратно 4. Таким образом, выравнивание в кратных 4 не происходит, или '0xaaa' является вымыслом. – chux

+0

Как насчет того, чтобы начать с некоторых экспериментов? – MikeCAT

ответ

1

Предполагая длинные 8 байтов, короткие 2 байта и память 4 байта, выровненный размер структуры равен 8 байт + 3 бит + 6 бит + 2 байта = 8 + 4 = 12 байт.

x [1] - это не что иное, как & x [1] [0].

Если х 0xaaa, х [1] 0xaaa + (5 * 12) = 0xaaa + 60.

Так х [1] составляет 60 байт от й.

+0

Я был под влиянием, что длинный 4 байта. Почему вы считаете, что это 8? – Genesis

+0

Это варьируется, например, в 64-битной машине linux ubuntu 14 long - 8 байт. Он не фиксирован. – Kamal

1

Давайте попробуем вычислить его. Первое, что вам нужно знать размер структуры. Поскольку размер зависит от реализации, рассмотрим 32-разрядную машину.

Первый член вашей структуры, guitarID, имеет 4 байта. Затем у вас есть 3 бита в бренде, 6 бит в строках. Эти 2 вместе с дополнением составляют еще 2 байта. И тогда у вас есть еще 2 байта в цене. В общей сложности ваша структура занимает 8 байтов.

Теперь посмотрим, как хранится ваш массив. У вас есть матрица из 5 на 5 элементов. В памяти он хранится линейно, например:

x [0] [0] x [0] [1] x [0] [2] x [0] [3] x [0] [4] x [1] [0] x [1] [1] x [1] [2] x [1] [3]

и так далее. Я не знаю точно, что вы подразумеваете под x [1], но я предполагаю, что вас интересует адрес x [1] [0]. Вы можете видеть, что перед ним 5 элементов, что означает, что у него есть адрес с 5 * 8 = 40 байт выше адреса первого элемента. Я не могу дать вам абсолютный адрес в качестве ответа, так как 0xaaa, который вы упомянули как адрес для первого элемента, не выравнивается по слову.

Смежные вопросы