gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:09:36 26 4
gpt4 key购买 nike

如下代码所示,s使用的是(uint16_t*),而则使用了(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;
}

最佳答案

该代码看起来好像正在准备对以太网数据包的答复,并交换数据包 header 中的目标和源地址。

MAC 地址有 48 位。即16+32,开发者决定使用16位数据类型加32位数据类型。正如已经指出的那样,这可能会也可能不会在现代的、积极优化的编译器上正常工作。即使如此,它可能无法在希望看到 32 位值与内存中的 32 位对齐的体系结构(例如 ARM)上工作。

代码最好将 MAC 地址视为字节数组并使用 memcpy 来移动字节。

从性能的角度来看,当使用一个非常愚蠢的编译器(考虑到当今的标准)时,该构造可能会很有帮助,该编译器无法识别它可以使用大型寄存器传输来移动数据。在现代编译器上,即使它工作正常,这些东西甚至可能会对性能产生负面影响。

关于c - (uint16_t*) 和 (uint32_t*) 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36575858/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com