c - 字符串初始值设定项会不会有点浪费内存?

标签 c arrays memory embedded language-lawyer

要初始化一个char数组,通常我这样写:

char string[] = "some text";

但是今天,我的一位同学说应该使用:

char string[] = {'s', 'o', 'm', 'e', ' ', 't', 'e', 'x', 't', '\0'};

我告诉他放弃可读性和简洁性是疯狂的,但他认为用字符串初始化 char 数组实际上会创建两个字符串,一个在堆栈中,另一个在只读内存中。在使用嵌入式设备时,这会导致 Not Acceptable 内存浪费。

当然,字符串初始值设定项看起来更清晰,所以我将在我的程序中使用它们。但问题是,字符串初始化程序会创建两个相同的字符串吗?或者字符串初始值设定项只是语法糖?

最佳答案

char string[] = "some text";

100% 等同于

char string[] = {'s', 'o', 'm', 'e', ' ', 't', 'e', 'x', 't', '\0'};

您的 friend 感到困惑:如果 string 是局部变量,那么在两种 情况下您都会创建两个字符串。驻留在堆栈上的变量 string 和驻留在只读内存 (.rodata) 中的只读字符串文字。

没有办法避免只读存储,因为所有数据都必须分配到某个地方。您不能凭空分配字符串文字。您所能做的就是将它从一个只读内存段移动到另一个只读内存段,这最终会为您提供完全相同的程序大小。

通常首选前一种样式,因为它更具可读性。它确实是一种语法糖。

但它也是首选,因为它可能会简化一些称为“字符串池”的编译器优化,这允许编译器以更有效的内存方式存储字符串文字 “some text”。如果逐个字符地初始化字符串,编译可能会或可能不会意识到它是一个只读字符串常量。

关于c - 字符串初始值设定项会不会有点浪费内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35449797/

相关文章:

javascript - 为什么我的 JavaScript float 被分割?

java - 在 Java 中获取大量屏幕截图时管理内存使用

python - 在python中使Eratosthenes筛分更有效的内存?

c - 从两个 128 位 block 中收集四个 32 位字

c - 在 C 中,按字符串长度对字符串数组进行排序

php - 每年的分数数组

C 数组 malloc 未知大小

Android 进入休眠状态导致 onCreate 运行两次

编译器认为 struct 是指向 struct 的指针

c - 如果文件大小不变, fopen 更新模式 ("rb+") 是否会更改文件的磁盘位置?