【发布时间】:2017-01-29 10:51:09
【问题描述】:
如果我想存储一个常量字符串,
const char array[] = "Some string literal.";
C 入门加书说
然后引用的字符串存储在作为可执行文件一部分的数据段中。只有在程序开始运行后才会为数组分配内存。此时,引用的字符串被复制到数组中。
这是否意味着为字符串文字分配了两次内存?
另一方面,当用指针声明时,它只为指针变量留出存储空间,并将字符串字面量的地址存储在其中。
const char *pt = "Some string literal.";
这意味着字符串文字只有一个副本,并且用字符串文字声明指针比数组更节省内存?
【问题讨论】:
-
“C 入门加书”(无论如何)对编译器的工作方式做出了不真实的概括——大概是基于 ONE 编译器的工作方式。该标准没有规定这些结构如何反映在可执行文件中,并且不同的编译器会做不同的事情(至少部分是因为不同的可执行格式允许以不同的方式完成事情)。
-
替代品的“效率”应该与您无关。这些永远不会成为任何规模的瓶颈;如果您的问题不完全是学术性质的,那么您就陷入了过早优化的陷阱。
-
@Peter-- 如果你不了解这本书,我认为破坏某人对他们正在学习的书的信心是没有帮助的。 C Primer Plus 是第 6 版,我发现它并不完美,但非常好。我们不知道OP的版本,但在我的版本中,首先说“字符串常量放在静态存储类中”,然后说“通常......引用的字符串被存储在数据段中......”我不会称这是不真实的概括,但你可能有理由不同意。
-
这一切都取决于实现细节。您可以检查您通常使用的实现会发生什么。这段代码是在块作用域还是文件作用域也有所不同。