LINUX.ORG.RU

История изменений

Исправление Dudraug, (текущая версия) :

Ты все еще несешь чуть, но ок объясню мы имеем две структуры.

{int,short}
{int, {short, short}}

И мы копируем побайтно из первой во вторую кол-во байт равное размеру первой. Значение второго short во вложенной мне до лампочки. (Вообще. Хоть будь там мусор, а не 0. ЗАЧЕМ ты показываешь, что второго шорта в первой нет? Думаешь я не в курсе?) И это работает(хоть и не по стандарту), хоть на 32, хоть на 64 битах. Потому что выравнивание short будет одинаковым в обоих случаях. Но я таки привел не совсем верный пример, но, как я сказал выше, телепаты меня поняли. На деле кейс такой:

{int, short}
{int, {short, short,....,{....,char*}}
В этом случае вложенная структура и первый short в ней имеют требования выравнивания 4 байта на 32битах (поэтому все и работало, ибо что в первой структуре, что во второй этот short имеет одинаковое выравнивание), но на 64 битах short во вложенной структуре имеет выравнивание 64бита, а в простой структуре 16. Поэтому при memcpy они друг на друга не ложатся.

Код изначально кривой и он уже переписан. Но идея топика в том, чтобы ПОНЯТЬ причины такого поведения, а не найти фикс. Инженеры не только фиксят, что не работают, но и пытаются понять почему не работало.

А ты рассказал вещи которые и так всем понятны, но к вопросу отношения не имеют.

Исходная версия Dudraug, :

Ты все еще несешь чуть, но ок объясню мы имеем две структуры.

{int,short}
{int, {short, short}}

И мы копируем побайтно из первой во вторую кол-во байт равное размеру первой. Значение второго short во вложенной мне до лампочки. (Вообще. Хоть будь там мусор, а не 0. ЗАЧЕМ ты показываешь, что второго шорта в первой нет? Думаешь я не в курсе?) И это работает(хоть и не по стандарту), хоть на 32, хоть на 64 битах. Потому что выравнивание short будет одинаковым в обоих случаях. Но я таки привел не совсем верный пример, но, как я сказал выше, телепаты меня поняли. На деле кейс такой:

{int, short}
{int, {short, short,....,{....,char*}}
В этом случае вложенная структура и первый short в ней имеют требования выравнивания 4 байта на 32битах (поэтому все и работало, ибо что в первой структуре, что во второй этот short имеет одинаковое выравнивание), но на 64 битах short во вложенной структуре имеет выравнивание 64бита, а в простой структуре 32. Поэтому при memcpy они друг на друга не ложатся.

Код изначально кривой и он уже переписан. Но идея топика в том, чтобы ПОНЯТЬ причины такого поведения, а не найти фикс. Инженеры не только фиксят, что не работают, но и пытаются понять почему не работало.

А ты рассказал вещи которые и так всем понятны, но к вопросу отношения не имеют.