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