gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:10:57 24 4
gpt4 key购买 nike

要初始化一个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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com