如下面的代码所示,(uint16_t*)
用于s
,(uint32_t*)
用于w
。为什么?该功能是否用于交换数据包中的目的MAC地址和源MAC地址?
static inline void
swap_mac_addr(uint64_t pkt_ptr)
{
uint16_t s;
uint32_t w;
/* assuming an IP/IPV6 pkt i.e. L2 header is 2 byte aligned, 4 byte non-aligned */
s = *(uint16_t*)pkt_ptr;
w = *(uint32_t*)(pkt_ptr+2);
*(uint16_t*)pkt_ptr = *(uint16_t*)(pkt_ptr+6);
*(uint32_t*)(pkt_ptr+2) = *(uint32_t*)(pkt_ptr+8);
*(uint16_t*)(pkt_ptr+6) = s;
*(uint32_t*)(pkt_ptr+8) = w;
}
答案 0 :(得分:1)
代码看起来好像准备回答以太网数据包并交换数据包标头中的目标和源地址。
MAC地址有48位。那是16 + 32,开发人员决定使用16位数据类型和32位数据类型。正如已经指出的那样,这可能会或可能不会在现代的,积极优化的编译器上正常工作。即使这样,它也可能不适用于想要在内存中看到32位值与32位对齐的架构(例如ARM)。
考虑到MAC地址可能是一个字节数组并使用memcpy来移动字节,代码会更好。
从性能的角度来看,构建可能在使用非常愚蠢的编译器(考虑今天的标准)时会有所帮助,而这些编译器无法识别它可能会使用大寄存器传输以移动数据。在现代编译器中,即使它正常工作,这些东西甚至可能会对性能产生负面影响。