Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 堆栈中每个内存单元的大小是多少?是否可以拆分一个单元_C_Ram - Fatal编程技术网

C 堆栈中每个内存单元的大小是多少?是否可以拆分一个单元

C 堆栈中每个内存单元的大小是多少?是否可以拆分一个单元,c,ram,C,Ram,在64位系统中,每个内存单元都是64位的,那么如何保存包含较少空间的int变量呢?它不会以任何方式花费一个64位地址吗?如果是这样的话,如果要以任何方式捕获一个单元格,为什么还要麻烦使用不同类型的变量呢。你对术语的使用到处都是 存储单元通常对应于硬件级别上的逻辑门,并且很可能是1位大的(假设为二进制计算机) 我想你问的是计算机中最小的可寻址单元,也称为字节,很可能是8位大 这和CPU的数据寄存器宽度无关,这是人们在谈论“64位计算机”时通常提到的。数据寄存器宽度是CPU可以在单个指令中处理的最大

在64位系统中,每个内存单元都是64位的,那么如何保存包含较少空间的int变量呢?它不会以任何方式花费一个64位地址吗?如果是这样的话,如果要以任何方式捕获一个单元格,为什么还要麻烦使用不同类型的变量呢。

你对术语的使用到处都是

存储单元通常对应于硬件级别上的逻辑门,并且很可能是1位大的(假设为二进制计算机)

我想你问的是计算机中最小的可寻址单元,也称为字节,很可能是8位大

这和CPU的数据寄存器宽度无关,这是人们在谈论“64位计算机”时通常提到的。数据寄存器宽度是CPU可以在单个指令中处理的最大数据块,但不一定是最小的。这与计算机的地址总线宽度无关,尽管现在它们通常是相同的

在C中声明变量时,分配的大小取决于系统。例如,在所有32位和64位计算机上,
int
很可能是32位大的。值得注意的是,所有主流64位计算机也支持32位或更小的指令。因此,编译器分配超过32位的内存并不一定有意义——在没有速度的情况下,您可能会获得更大的内存使用


我相信你想要的术语是对齐。如果在未对齐的地址上分配较小的数据块,计算机读取这些数据块的效率很低。也就是说,不能被数据寄存器宽度(以字节表示)平均整除的地址。这种访问通常较慢,或者在某些情况下根本不受支持。因此,64位编译器可能因此决定在8字节块中分配一个小变量,并保留不用作填充字节的剩余字节。但是,如果编译器优化了大小,它可能会选择以更有效的内存方式存储数据,而代价是访问时间。

您对术语的使用无处不在

存储单元通常对应于硬件级别上的逻辑门,并且很可能是1位大的(假设为二进制计算机)

我想你问的是计算机中最小的可寻址单元,也称为字节,很可能是8位大

这和CPU的数据寄存器宽度无关,这是人们在谈论“64位计算机”时通常提到的。数据寄存器宽度是CPU可以在单个指令中处理的最大数据块,但不一定是最小的。这与计算机的地址总线宽度无关,尽管现在它们通常是相同的

在C中声明变量时,分配的大小取决于系统。例如,在所有32位和64位计算机上,
int
很可能是32位大的。值得注意的是,所有主流64位计算机也支持32位或更小的指令。因此,编译器分配超过32位的内存并不一定有意义——在没有速度的情况下,您可能会获得更大的内存使用


我相信你想要的术语是对齐。如果在未对齐的地址上分配较小的数据块,计算机读取这些数据块的效率很低。也就是说,不能被数据寄存器宽度(以字节表示)平均整除的地址。这种访问通常较慢,或者在某些情况下根本不受支持。因此,64位编译器可能因此决定在8字节块中分配一个小变量,并保留不用作填充字节的剩余字节。但是,如果编译器对大小进行优化,它可能会选择以更有效的内存方式存储数据,但会以访问时间为代价。

@Lundin我明白了,唯一的区别是cpu寄存器。
sizeof
操作符将告诉您一个变量使用了多少个可寻址存储单元。C标准将这些最小可寻址存储单元称为“字节”,即使它们的宽度超过8位(但必须至少为8位)。@Lundin我明白了,所以唯一的区别是cpu寄存器?
sizeof
操作符将告诉您一个变量使用多少可寻址存储单元。C标准将这些最小可寻址存储单元称为“字节”,即使它们的宽度超过8位(但必须至少为8位)。因此,在普通主流计算机上,堆栈中的每个地址都是8位?@dashaish是的。堆栈特别可用于存储所有类型的内容。还值得一提的是,内存是通过缓存线大小访问的,通常大于字大小。很抱歉不选择,但“数据寄存器宽度是CPU在一条指令中可以处理的最大数据块”不是完全准确的,因为有些体系结构的指令同时处理多个寄存器,比如加载和存储ARM Thumb指令集。@斯塔克,不是真的:从处理器的角度来看,无论是否启用缓存,内存的访问方式都是相同的。所以堆栈中的每个地址都是8位?@dasehaish Yes,在普通的主流电脑上。堆栈特别可用于存储所有类型的内容。还值得一提的是,内存是通过缓存线大小访问的,通常大于字大小。很抱歉不选择,但“数据寄存器宽度是CPU在一条指令中可以处理的最大数据块”不是完全准确的,因为有些体系结构中的指令同时处理多个寄存器,比如加载并存储ARM Thumb指令集。@斯塔克,不是真的:从处理器的角度来看,无论是否启用缓存,访问内存的方式都是相同的。