-1

我们可以使用 2 种方法存储字符串。

方法一:使用数组

char a[]="str";

方法二:

char *b="str";

在方法 1 中,内存仅用于存储字符串“str”,因此使用的内存为 4 个字节。

在方法 2 中,内存用于将字符串“str”存储在“Read-Only-Memory”上,然后用于存储指向字符串第一个字符的指针。所以使用的内存必须是 4 个字节用于在 ROM 中存储字符串,然后 8 个字节用于存储指向第一个字符的指针(在 64 位机器中)。

第一种方法总共使用 4 个字节,方法 2 使用 12 个字节。在 C/C++ 中存储字符串时,方法 1 总是比方法 2 更好。

4

3 回答 3

2

除非您使用资源高度受限的系统,否则您不应该太在意指针使用的内存。无论如何,优化编译器可能会导致两种情况下的代码相同。

在第二种情况下,您应该更关心未定义的行为!

char a[] = "str";

正确声明了一个非 const 字符数组,该数组初始化"str". 这意味着这a[0] = 'S';是完全允许的,并将更改a"Str".

但随着

char *b = "str";

您声明了一个指向隐含 const 的 litteral char 数组的非 const 指针。这意味着b[0] = 'S';尝试修改乱码字符串并且是未定义的行为=>它可以工作,段错误或介于两者之间的任何内容,包括不更改字符串。

于 2017-01-19T10:35:11.170 回答
1

您引用的所有数字以及存储字符串文字的内存类型都是特定于平台的。

存储字符串、数组或指针哪种方式更有效

关于术语的一些迂腐:指针不能存储字符串;它存储一个地址。字符串总是存储在一个数组中,并且一个指针可以指向它。特别是字符串文字存储在静态存储持续时间的数组中。

方法一:使用数组char a[]="str"

这会将字符串文字的内容复制到一个自动存储持续时间的本地数组中。

方法二:char *b="str";

您不能将非 const 指针绑定到标准 C++ 中的字符串文字。这在该语言中格式不正确(从 C++11 开始;在此之前,转换只是被弃用)。即使在允许这种转换的 C(和 C++ 的扩展)中,这也是非常危险的,因为您可能会不小心将指针传递给可能试图修改指向字符串的函数。const 正确性用编译时错误替换了意外的 UB。

忽略这一点,这不会复制文字,而是指向它。

在 C/C++ 中存储字符串时,方法 1 总是比方法 2 更好。

内存使用并不是唯一重要的指标。方法 1 需要将字符串从文字复制到自动数组中。不复印通常比复印要快。随着越来越长的字符串,这变得越来越重要。

方法 1 和 2 之间的主要区别在于,您可以修改方法 1 的本地数组,但不能修改字符串文字。如果你需要一个可修改的缓冲区,那么方法 2 不会给你这个——不管它的效率如何。

于 2017-01-19T10:40:40.937 回答
1

其他注意事项:

假设您的系统不是基于 RAM 的 PC 计算机,而是具有真正非易失性存储器 (NVM) 的计算机,例如微控制器。然后,字符串文字"str"将在这两种情况下都存储在 NVM 中。

在数组的情况下,字符串文字必须在运行时从 NVM 复制下来,而在指针的情况下,您不必复制,您可以直接指向字符串文字。

这也意味着在这样的系统上,假设 32 位,数组版本将占用 4 字节的 RAM 用于数组,而指针版本将占用 4 字节的 RAM 用于指针。对于字符串文字,这两种情况都必须占用 4 个字节的 NVM。

于 2017-01-19T11:56:00.693 回答