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

时间:2017-01-19 10:07:23

标签: c++ c pointers c-strings char-pointer

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

方法1:使用数组

char a[]="str";

方法2:

char *b="str";

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

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

总的来说,第一种方法使用4个字节,方法2使用12个字节。因此,方法1总是优于方法2,用于在C / C ++中存储字符串。

3 个答案:

答案 0 :(得分:1)

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

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

char a[] = "str";

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

但是

char *b = "str";

你声明一个非const指针指向一个隐含的const数组。这意味着b[0] = 'S';尝试修改一个小字符串,并且是Undefined Behavior =>它可以工作,段错或其他任何东西,包括不改变字符串。

答案 1 :(得分:0)

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

  

这是存储字符串,数组或指针的更有效方法

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

  

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

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

  

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

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

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

  

方法1总是优于方法2,用于在C / C ++中存储字符串。

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

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

答案 2 :(得分:0)

其他注意事项:

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

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

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