当 paddr_t 被传递给一个在 64 位系统上需要 unsigned 的链表时会发生什么?
What happens when a paddr_t is passed to a linked list that is expecting unsigned on a 64bit system?
仔细查看代码后,我找到了问题的答案。我错误地认为链表的初始声明意味着所有未来的类型必须相同
我正在查看的代码是用于链表插入的。链表用于存储逻辑地址。链表定义为无符号 32 位,但插入的地址定义为 void*.
一个逻辑地址被强制转换为paddr_t,然后被插入。 paddr_t 用于与 32 位或 64 位系统反向兼容,因为 void* 大小发生变化。
当paddr_t传递给insert函数时,insert函数的参数会被提升为paddr_t吗?插入完成后链表成员是否也会提升?
代码的缩写示例
LinkedList <unsigned> foo;
unsigned bar = 1001;
void* Laddr = &bar;
foo.insert((paddr_t)Laddr);
假设 LinkedList
的 common-sense 定义:您没有将 paddr_t
传递给插入函数。您将 unsigned
传递给插入函数。如果您尝试传递 paddr_t
,编译器将为您添加一个 (unsigned)
转换,并且可能会或可能不会发出警告。
如果 paddr_t
和 unsigned
是同一类型,您不太可能会收到警告,而且很有可能会正常工作。
如果 paddr_t
大于 unsigned
,并且您有一个 paddr_t
不适合 unsigned
,那么多余的位将被删除以使其适合 unsigned
,该数字将存储在列表中,无论什么代码都会将数字返回 out 并将其转换回 paddr_t
将无法正常工作,因为它得到了错误的数字。
仔细查看代码后,我找到了问题的答案。我错误地认为链表的初始声明意味着所有未来的类型必须相同
我正在查看的代码是用于链表插入的。链表用于存储逻辑地址。链表定义为无符号 32 位,但插入的地址定义为 void*.
一个逻辑地址被强制转换为paddr_t,然后被插入。 paddr_t 用于与 32 位或 64 位系统反向兼容,因为 void* 大小发生变化。
当paddr_t传递给insert函数时,insert函数的参数会被提升为paddr_t吗?插入完成后链表成员是否也会提升?
代码的缩写示例
LinkedList <unsigned> foo;
unsigned bar = 1001;
void* Laddr = &bar;
foo.insert((paddr_t)Laddr);
假设 LinkedList
的 common-sense 定义:您没有将 paddr_t
传递给插入函数。您将 unsigned
传递给插入函数。如果您尝试传递 paddr_t
,编译器将为您添加一个 (unsigned)
转换,并且可能会或可能不会发出警告。
如果 paddr_t
和 unsigned
是同一类型,您不太可能会收到警告,而且很有可能会正常工作。
如果 paddr_t
大于 unsigned
,并且您有一个 paddr_t
不适合 unsigned
,那么多余的位将被删除以使其适合 unsigned
,该数字将存储在列表中,无论什么代码都会将数字返回 out 并将其转换回 paddr_t
将无法正常工作,因为它得到了错误的数字。