【问题标题】:Does array initialization with a string literal cause two memory storage? [duplicate]使用字符串文字进行数组初始化会导致两个内存存储吗? [复制]
【发布时间】:2021-04-24 11:03:57
【问题描述】:
int main()
{
    char a[] = "123454321";
}

"123454321" 是字符串文字,字符串文字会留出内存存储空间。 a 由同样导致内存存储的语句定义。也就是这个简单的语句char a[] = "123454321";会导致两个内存存储,一个是给a的,另一个是给"123454321"的。对吗?

【问题讨论】:

    标签: c string-literals array-initialization


    【解决方案1】:

    是的,没错。

    请注意,= 右侧的对象不是字符串文字本身;这是一个初始化表达式,编译器没有义务将其存储为字符串。它可能会将其分解成碎片,或者发出一系列立即存储而不是复制初始值,或者甚至(理论上)发出解压缩初始数据的缩短版本的代码。但是不管怎么编译,都会占用一些内存。

    如果编译器确实选择将初始值存储为字符串,则该值需要是不可变的,因此它可以放置在只读内存中和/或与具有相同值的字符串文字共享。另一方面,a 是可变的并且可以更改。很明显,它一定有自己的记忆。

    最后,在一种情况下,编译器可能根本不保留 ant 空间。如果它可以证明删除不会导致任何可见的更改,它可能会优化未使用的数组和初始值中的一个或两个,就像您问题中的示例代码一样。

    【讨论】:

    • 感谢您的检查!我想再问一个关于你的答案的问题。 it may ... and/or be shared with another string literal with the same value 我在 K&R(2nd) 194p 中读到“相同的字符串文字是否不同是实现定义的,...”。共享另一个具有相同值的字符串文字是否更常见?
    • @opol:如果它们在同一个翻译单元中,大多数编译器共享字符串文字。一些实现设法在翻译单元之间共享字符串文字,使用专门的链接器。
    • const 是不够的,因为 main 可以重入。如果使用static,那么可能不会有额外的分配,无论是否为 const。
    • "字符串文字是不可变的" 从技术上讲,字符串文字甚至不需要存储在任何地方。我对相关问题here的回答中有一个例子。
    • @dxiv:是的,这很好。初始值必须在可执行文件中的某个位置,但不必是字符数组;它可能是一系列立即操作数。理论上,它甚至可以被计算出来,但这会令人惊讶。
    猜你喜欢
    • 2021-09-16
    • 2016-05-28
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    相关资源
    最近更新 更多