重复输入的计算机内存分配

Computer Memory Allocation for Duplicate Inputs

我正在学习 CS 简介(CS50,哈佛),我们正在学习 C 中的类型声明。当我们声明一个变量并分配一个类型时,计算机会分配特定数量的 bits/bytes( char 为 1 个字节,int 为 4 个字节,double 为 8 个字节等...)。

例如,如果我们声明字符串 "EMMA",我们将使用 5 个字节,每个 "char" 1 个字节,[=10=] 空字节额外使用 1 个字节。

嗯,我想知道为什么 2 M 分配了单独的字节。计算机不能利用内存中当前占用 space 的字符或整数,并在需要重用时引用该特定插槽吗?

希望对此事进行一些教育(不要太深入,因为我是该领域的新手)。

编辑:将一些位固定为字节 — 我的错误

编译器不应该是 code/program,而是做最少的事情,它必须执行任务,以便程序员易于理解和操作,换句话说,它必须是 一般

作为一名程序员,您可以让您的程序以建议的方式保存数据,但它不会是通用的。

例如-我正在为我的学校创建一个数据库,但我输入了错误的名称,现在我想更改 "EMMA" 中的第二个 'm',如果系统正常工作,这会很麻烦按照你的建议。

如果需要,很乐意进一步澄清。 :)

1 bit for char, 4 bytes for int, 8 bytes for doubles etc...

这些是一般值,但它们取决于体系结构(根据 this answer,如今甚至还有每字节 9 位的体系结构在销售)。

Can't the computer make use of the chars or integers currently taking space in the memory and refer to that specific slot when it wants to reuse it?

虽然这个想法在理论上确实可行,但在实践中,对于像字符这样的简单数据来说,开销太大了:一个字符通常是一个字节。

如果我们要建立一个系统,在这个系统中我们为字符值分配内存并且只从字符串中引用它,那么字符串将由一系列元素组成,这些元素将用于存储哪个字符应该在那里:在 C 中,这将是一个指针(您会在课程中的某个时刻遇到它们)并且通常为 4 或 8 个字节长(32 或 64 位)。假设您使用 32 位指针,您将使用 24 个字节的内存以这种复杂的方式存储字符串,而不是使用更简单的方法使用 5 个字节(要扩展 ,您将需要更多的元数据能够在程序执行期间正确修改字符串)。

然而,在几种情况下确实存在您存储一大块数据并多次引用它的想法:

  • virtual memory(如果你往OS开发会遇到这个),这里用到copy-on-write
  • 高级语言(如 C++)
  • 实现 写时复制 功能的文件系统,例如 BTRFS
  • 一些备份系统(如 borgrsync)对它们存储的 files/chunks 进行重复数据删除
  • Facebook 的 zstandard compression algorithm, where a dictionnary of small common chunks 数据用于提高压缩率和速度

在这种存储大量数据的设置中,存储数据一次并多次引用数据并缩短复制时间所需的信息的相对大小值得增加复杂性。

For instance if we declare the string "EMMA", we're using 5 bits

我确定您说的是 5 个字节而不是 5 位。

Well, I was wondering why 2 M's are allocated separate bits. Can't the computer make use of the chars or integers currently taking space in the memory and refer to that specific slot when it wants to reuse it?

指向"slot"的指针通常占用4或8个字节。所以花8个字节指向一个只占一个字节的对象是没有意义的

而且"EMMA"是由相邻字节组成的字符数组。所以数组的所有元素都具有相同的类型和相应的大小。

编译器可以通过避免重复的字符串文字来减少内存使用。例如,它可以将相同的字符串文字存储为一个字符串文字。这取决于编译器选项。

所以如果在程序中相同的字符串文字出现两次,例如在这些语句中出现两次

char *s = malloc( sizeof( "EMMA" ) );
strcpy( s, "EMMA" );

那么编译器只能存储一份字符串文字。