gpt4 book ai didi

c - 关于 ether_addr_equal 函数的未对齐问题?

转载 作者:太空狗 更新时间:2023-10-29 11:07:37 29 4
gpt4 key购买 nike

我正在阅读一些关于未对齐内存访问问题的文章并引用了这篇文章 UNALIGNED MEMORY ACCESSES

bool ether_addr_equal(const u8 *addr1, const u8 *addr2) {
#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
u32 fold = ((*(const u32 *)addr1) ^ (*(const u32 *)addr2)) |
((*(const u16 *)(addr1 + 4)) ^ (*(const u16 *)(addr2 + 4)));
return fold == 0;
#else
const u16 *a = (const u16 *)addr1;
const u16 *b = (const u16 *)addr2;
return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2])) != 0;
#endif
}

它说:

But when the hardware isn't able to access memory on arbitrary boundaries, the reference to a[0] causes 2 bytes (16 bits) to be read from memory starting at address addr1.

嗯,我不知道那是什么意思。在我看来,a[0] 必须从 addr1 读取 2 个字节,如果不是,它将读取什么? (可能会崩溃,但我认为这是 2 个字节或什么都没有的情况)。那么这里会出现什么问题呢?为什么不使用u8*,一个字节一个字节的比较来解决未对齐的问题呢?

最佳答案

In my mind,a[0] must be read 2 bytes from addr1,if not,what will it read? So what problem will occur here?

预期的意思肯定是 a[0] 使用 2- 从 addr1 读取一个字节,从 addr1 + 1 读取一个字节字节存取。系统可能有一个限制,要求从偶数地址边界开始进行 2 字节访问。如果 addr1 为奇数,则违反。

And why don't they use u8* and compare one byte by one byte to solve the unaligned problem?

可能假设目标系统不会遇到上述问题。一次使用一个字节即可处理这种情况。


注意:看起来该函数的两半在功能上并不等效。考虑数据位全为零,第一个返回 true,第二个返回 false

关于c - 关于 ether_addr_equal 函数的未对齐问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39598766/

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