[英]What is the difference between (uint16_t*) and (uint32_t*)?
如以下代码所示, (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;
}
该代码看起来就像是准备一个以太网数据包的答案,并在数据包头中交换目标地址和源地址。
MAC地址具有48位。 即16 + 32,开发人员已决定使用16位数据类型加32位数据类型。 正如已经指出的那样,这在现代的,积极优化的编译器上可能会或可能无法正常工作。 即使这样,它也可能无法在希望看到32位值与内存中的32位对齐的体系结构上起作用(例如,ARM)。
该代码最好考虑将MAC地址视为字节数组,并使用memcpy来移动字节。
从性能的角度来看,当使用一个漂亮的笨拙的编译器(考虑当今的标准)时,该构造可能会有所帮助。 在现代编译器上,即使它可以正常工作,这些东西甚至会对性能产生负面影响。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.