字符串需要多少内存

时间:2012-05-30 19:50:54

标签: memory memory-management data-structures

我知道这是一个非常基本的问题。我从维基百科和几个MSDN页面读过内存management。但是我仍然不确定在程序执行期间如何处理以下处理。

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

  1. 哪个内存编译器用来存储值? (我认为是RAM)
  2. 需要多少内存空间? (考虑到它是一个8位机器和字符串,如'我是计算机编程的新手')
  3. 当我在运行时更新字符串值时,编译器如何知道存在哪个内存地址字符串值
  4. 当我创建矩阵时,个别值如何存储到内存中?
  5. 请考虑我在.Net中使用C#,这是我的字符串s ='我是计算机编程的新手'

    提前致谢。

1 个答案:

答案 0 :(得分:2)

第一部分,字符串。

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

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

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

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

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

  4. 功能语言是一个完全不同的商店。

    第二部分,矩阵。

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

    所以要存储

    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)。