在 C/C++ 中存储字符串、数组或指针的哪种方式更有效?

Which is more efficient way for storing strings, an array or a pointer in C/C++?

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

方法一:使用数组

char a[]="str";

方法二:

char *b="str";

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

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

方法一总共使用了 4 个字节,方法二使用了 12 个字节。因此,在 C/C++.

中存储字符串的方法 1 总是优于方法 2

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

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

char a[] = "str";

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

但是

char *b = "str";

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

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

Which is more efficient way for storing strings, an array or a pointer

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

Method 1: using array char a[]="str";

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

Method 2: char *b="str";

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

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

So is the method 1 always better than method 2 for storing strings in C/C++.

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

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

其他注意事项:

假设您的系统不是 RAM-based PC 计算机,而是具有真正 non-volatile 内存 (NVM) 的计算机,例如微控制器。在这两种情况下,字符串文字 "str" 都会存储在 NVM 中。

在数组的情况下,字符串文字必须从 run-time 中的 NVM 复制下来,而在指针的情况下你不必复制,你可以直接指向字符串文字.

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