在64位计算机中分配32位整数数组
Allocating 32-bit integer arrays in 64-bit machines
我有一台64位i7机器。假设我为n个32位整数分配内存。分配中将实际使用多少个物理寄存器:n或n/2?
我试着写下面的简单程序来找出答案。
#include <iostream>
#include <cstdlib>
using namespace std;
int main (int argc, char *argv[]) {
int a[4];
cout << &a[0] << "t" << &a[3] << endl;
cin.ignore (1);
return 0;
} // End main ()
输出为:
0018FA04 0018FA10
他们似乎相距更远。为什么地址04和07没有呢?这是否意味着系统实际上分配了四个(或更多)整数,而不是将四个32位整数打包到两个64位寄存器中?
提前感谢您的帮助。
每个int是32位(4个字节)。其中3个构成12个字节。0x0018FA10-0x0018FA04=12。
我有一台64位i7机器。假设我为n个32位整数分配内存。分配中将实际使用多少个物理寄存器:n或n/2?
64位i7机器是x8_64体系结构。
在这个体系结构中,32位整数的数组将被完全打包分配,这意味着数组的大小将为4n字节。
如果您所说的物理寄存器是指机器字,并且您认为x86_64上的机器字是64位的,那么它将使用n/2个机器字。
我不会使用物理寄存器这个词,这可能会与cpu寄存器混淆,cpu寄存器不是分配阵列的地方(除非非常小,优化器很积极)。
他们似乎相距更远。为什么地址04和07没有呢?这是否意味着系统实际上分配了四个(或更多)整数,而不是将四个32位整数打包到两个64位寄存器中?
因为体系结构是字节寻址而不是字寻址节。
这是布局:
a[0]; // 0018FA04 00 00 00 00
a[1]; // 0018FA08 00 00 00 00
a[2]; // 0018FA0C 00 00 00 00
a[3]; // 0018FA10 00 00 00 00
它与寄存器大小无关。
首先,使用sizeof(int)
了解int在系统上的宽度。然后sizeof(int) * N
应该给出数组所占用的字符数。除非存在我称之为奇怪的系统(因为奇怪的对齐或填充数据,我认为这些数据已经对齐…edit尽管64位系统可能更喜欢用额外的32位来对齐填充它们的32位数据,这听起来几乎是合乎逻辑的),否则在所提供的特定示例中应该是sizeof(int) * 4 == sizeof(a)
。当然,数组a可能没有保存在任何CPU寄存器中,但它在main函数的堆栈上。
编辑
例如,
#include <iostream>
#include <cstdlib>
using namespace std;
int main (int argc, char *argv[]) {
int a[4];
cout << &a[0] << "t" << &a[3] << endl;
cout << sizeof(int) << " " << sizeof(a) << endl;
cin.ignore (1);
return 0;
} // End main ()
在一台用Sun CC-m64编译的sparc机器上,给出了
ffffffff7ffff748 ffffffff7ffff754
4 16
- 如何忽略32位整数中的特定位
- 检测 32 位整数溢出
- 将 64 位整数中的每个其他位与 32 位整数进行比较
- 对 32 位整数进行哈希处理比对 3 个 16 位整数的哈希进行按位运算慢?
- SSE 整数 2^n 的 2 次方,对于没有 AVX2 的 32 位整数
- 32 位整数缩放,无溢出
- Visual C 32位整数从文件到8位字符到文件 - 程序在某些整数上崩溃
- 将 32 位浮点数和不强制转换的 32 位整数与双精度进行比较,当其中一个值可能太大而无法完全适合另一种类型时
- 尝试从另一个过程读取32位整数时,ReadProcessMemory崩溃了
- 使用非 32 位整数是否合理
- 这种计算 32 位整数中设置位数的算法如何工作
- 是否可以在 64 位应用程序中使用 32 位整数
- 在32位整数中编码4个值
- 使用 Python 编程的 32 位整数中有多少个'1'
- 从 BYTE 数组读取 32 位整数.VC++
- 在64位计算机中分配32位整数数组
- 将2^31赋给有符号和无符号的32位整数变量后的奇怪结果
- 如何将32位整数转换为32位浮点数,以保持顺序
- c++中8位整数和32位整数之间的与运算
- 64位和32位整数