-2

我知道这是一个非常基本的问题。我已经从 Wikipedia 和几个 MSDN 页面阅读了内存管理。但是我仍然不确定在程序执行期间如何进行以下处理。

当我在我的程序中声明一个长字符串时

  1. 哪个内存编译器用于存储值?(我认为是内存)
  2. 它需要多少内存空间?(考虑到它是一个 8 位机器和字符串,例如“我是计算机编程新手”)
  3. 当我在运行时更新字符串值时,编译器如何知道存在哪个内存地址字符串值
  4. 当我创建一个矩阵时,单个值如何存储到内存中?

请考虑我在 .Net 中使用 C#,这是我的字符串 s = '我是计算机编程的新手'

提前致谢。

4

1 回答 1

2

第一部分,弦乐。

正如很多人告诉你的,有很多方法可以表示一个字符串。最常见的做法是将字符串存储为数组。但是,您需要一些额外的信息:这个数组的长度。

每种(过程式或命令式)语言都以不同的方式解决这个问题。

  1. 有“帕斯卡字符串”,其中数组的前几个字节存储字符串的长度。

  2. 有“C 字符串或以 null 结尾的字符串”,其中没有额外的字节来存储长度,但数组中的最后一个字节的值为零。

  3. 在 COM 中使用了一种混合方法,即 BSTR。它在开头使用 4 个字节来存储字符串的长度,并在结尾使用一个两字节标记(两个零字节)。它允许将字符串传递给 C 程序,同时快速获取长度。

函数式语言是完全不同的商店。

第二部分,矩阵。

要存储多维(在您的情况下为二维)数组,必须对其“线性化”,即将其转换为一维数组以使用计算机的内存硬件。

所以要存储

float A[W][H];

你至少分配

sizeof(float)*W*H

字节的内存来存储数据。对 A[i][j] 的访问是通过访问地址处的内存字节来完成的

addr(A) + (i * H + j)

或地址

addr(A) + (j * W + i)

这是 C 和 Fortran 采用的两种方法。

但是,如果您需要存储一些稀疏矩阵,可能还有其他一些选项。例如,您可以存储表示矩阵的非零元素的三元组 (i,j,value)。

于 2012-05-30T20:15:34.090 回答