C和Java中字符的内存分配

not*_*eek 3 c java string

内存空间分配如何影响 C 和 Java 中字符串长度的操作?(这是因为 C 字符串变量每个字打包 4 个字节,而 Java 字符串变量每个字打包两个半字)

0de*_*al0 5

事实上,C 中没有任何 C 字符串变量,它们只是数组;字符数组。C 中的1 个char占据1 byte。字符串文字仅存储为字符数组和终止符\\0在末尾附加终止符。

\n\n

在 Java 编程语言中,字符串是对象。\n字符串包含以下内容:

\n\n
    \n
  1. 一个字符数组\xe2\x80\x94,因此是一个包含实际字符的单独对象\xe2\x80\x94;
  2. \n
  3. 字符串开始处的数组的整数偏移量;\n字符串的长度;
  4. \n
  5. 另一个 int用于缓存计算的哈希码。
  6. \n
\n\n

这意味着即使字符串不包含任何字符,它也需要 4 个字节用于 char 数组引用,加上 3*4=12 个字节用于三个 int 字段,再加上 8 个字节的对象头。这给出了 24 个字节(这是 8 的倍数,因此到目前为止不需要“填充”字节)。然后,(空)char 数组将需要另外 12 个字节(数组有额外的 4 个字节来存储其长度),在本例中加上 4 个字节的填充,以使 char 数组对象使用的内存达到16. 因此,一个空字符串总共使用 40 个字节。

\n\n

计算字符串的内存使用量时,您必须考虑到数组中的字符为 2 个字节的事实。

\n\n

JAVA->String.length()是对字符串中包含的字符数进行常数时间操作,因为java字符串类将长度存储为字段。

\n\n

C-> strlen()遍历整个数组,直到\\0计算出字符串的长度,其运行时间随着字符串的大小而增长。

\n