Memory 一个字符串需要多少内存

Memory 一个字符串需要多少内存,memory,memory-management,data-structures,Memory,Memory Management,Data Structures,我知道这是一个非常基本的问题。我读过维基百科和几页MSDN的记忆。但我仍然不确定在程序执行期间,下面的处理是如何发生的 当我在程序中声明一个长字符串时 哪个内存编译器用于存储该值?(我想是拉姆) 它需要多少内存空间?(考虑到它是一台8位机器,字符串类似于‘我是计算机编程新手’) 当我在运行时更新字符串值时,编译器如何知道哪个内存地址字符串值存在 当我创建一个矩阵时,那么单个值是如何存储到内存中的呢 请考虑我在.NET中使用C语言,这里是我的字符串s=“我是计算机编程新手” 提前谢谢。第一部分,弦

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

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

  • 哪个内存编译器用于存储该值?(我想是拉姆)
  • 它需要多少内存空间?(考虑到它是一台8位机器,字符串类似于‘我是计算机编程新手’)
  • 当我在运行时更新字符串值时,编译器如何知道哪个内存地址字符串值存在
  • 当我创建一个矩阵时,那么单个值是如何存储到内存中的呢
  • 请考虑我在.NET中使用C语言,这里是我的字符串s=“我是计算机编程新手”


    提前谢谢。

    第一部分,弦乐

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

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

  • 这里有“pascal字符串”,数组的前几个字节存储字符串的长度

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

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

  • 函数式语言是一个完全不同的存储

    第二部分,矩阵

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

    所以要存储

    float A[W][H];
    
    你至少分配

    sizeof(float)*W*H
    
    存储数据的内存字节数。通过访问地址处的内存字节来访问[i][j]

    addr(A) + (i * H + j)
    
    addr(A) + (j * W + i)
    
    还是地址

    addr(A) + (i * H + j)
    
    addr(A) + (j * W + i)
    
    这是C和Fortran使用的两种方法


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

    表示
    字符串的方法有很多种。
    ,您能否至少为我们提供一种语言或编译器?这是一个非常普遍的问题,给我们提供更多信息、平台、语言等,并请关注问题。对于矩阵,也有各种可能的表示法。如上所述,答案实际上取决于您使用的语言/平台。