【发布时间】:2012-08-07 17:33:49
【问题描述】:
我有一个 64 位内核,我在用户空间运行 32 位进程。在用户进程代码中,如果我声明一个 64 位变量,它将如何被引用。它会导致 2 次内存读取吗? 基本上情况是: 我需要在我的用户进程中使用 64 位掩码。 方法1: -> 使用 u64bits 变量。 方法 -> 使用 2 个 32 位变量的数组。
【问题讨论】:
标签: memory kernel x86-64 32bit-64bit
我有一个 64 位内核,我在用户空间运行 32 位进程。在用户进程代码中,如果我声明一个 64 位变量,它将如何被引用。它会导致 2 次内存读取吗? 基本上情况是: 我需要在我的用户进程中使用 64 位掩码。 方法1: -> 使用 u64bits 变量。 方法 -> 使用 2 个 32 位变量的数组。
【问题讨论】:
标签: memory kernel x86-64 32bit-64bit
首先:内核与这个问题的答案无关。
其次,我假设这是您正在谈论的 x86。在可能的情况下,编译器会将 64 位值放置在 2 个 32 位寄存器中。例如,如果你从一个函数返回一个uint64_t,那么低32位将存储在eax寄存器中,而高位将存储在edx中。
编译器通常会为性能和正确性做正确的事情:使用数组可能只会混淆它并导致更糟糕的结果。
顺便说一下,x86-64 CPU 通常会以与单个 64 位读取相同的速度执行 2 个相邻 32 位字的读取。 64 位模式的优点是 算术 可以直接在 64 位值上完成(1 个 64x64 乘法指令 vs 3-4 个 32x32 指令),寄存器中有更多可用空间(16 个寄存器而不是 8 个,寄存器的宽度是原来的两倍),当然还有更大的虚拟地址空间。
【讨论】: