Есть ли какие-либо преимущества или недостатки в том или ином случае?
Да, поскольку функциональность может отличаться, код должен делать то, что функционально необходимо.
cx[0] = x &0xff; cx[1] = (x >> 8) & 0xff;
переместить младший байт значения в cx[0]
, а следующий старший байт в cx[1]
.
memcpy(cx, (char*)&x, 2);
переместить младший адресуемый байт x
в cx[0]
, а следующий адресуемый байт x
в cx[1]
.
Эти два подхода имеют одинаковую функциональность, когда с определенным порядковым номером и общим short
размером.
Что такое best зависит от большего кода, а не от этого узкого фрагмента.
С точки зрения производительности это подпадает под микрооптимизация . Хороший компилятор может анализировать memcpy()
и генерировать эффективный код без вызова функции. Время программиста лучше потратить на работу с более высокими уровнями кода для повышения производительности.
Нет необходимости в приведении в memcpy(cx, (char*)&x, 2);
Имейте в виду, что short
не всегда указывается в определенном endian . Необычно short
это не 2 char
.
E1 >> 8
приводит к «Если E1 имеет тип со знаком и отрицательное значение, результирующее значение определяется реализацией».
Лучший код будет использовать беззнаковые типы и избежать тонких проблем.
Обратите внимание, что здесь нет приведения от short
к char
, как в заголовке.