繁体   English   中英

(uint16_t *)和(uint32_t *)有什么区别?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM