如果我调用像 myObj.setType("fluid"); 这样的函数 在一个程序中,有多少次文字“流体”的副本保存在内存中?编译器能否识别出这个文字已经定义并再次引用它?
6 回答
这与 C++(语言)无关。相反,它是编译器可以做的“优化”。因此,答案是和否,取决于您使用的编译器/平台。
@David 这是来自该语言的最新草案:
§ 2.14.6(第 28 页)
是否所有字符串文字都是不同的(即,存储在非重叠对象中)是 实现定义的。尝试修改字符串文字的效果是未定义的。
重点是我的。
换句话说,C++ 中的字符串文字是不可变的,因为修改字符串文字是未定义的行为。因此,编译器是免费的,以消除冗余副本。
顺便说一句,我说的只是 C++ ;)
是的,它可以。当然,这取决于编译器。对于 VC++,它甚至是可配置的:
http://msdn.microsoft.com/en-us/library/s0s0asdt(VS.80).aspx
是的,它可以,但不能保证它会。如果您想确定,请定义一个常数。
这是一个编译器实现问题。我使用的许多编译器都可以选择共享或合并重复的字符串文字。允许重复的字符串文字会加快编译过程,但会产生更大的可执行文件。
2.13.4/2:“是否所有字符串文字都是不同的(即存储在不重叠的对象中)是实现定义的”。
这允许您询问的优化。
顺便说一句,至少在标准的该部分中,可能存在轻微的歧义。字符串文字的定义对我来说并不太清楚,以下代码是两次使用一个字符串文字,还是每次使用两个字符串文字:
const char *a = "";
const char *b = "";
但是下一段说“在翻译阶段 6 中,连接了相邻的窄字符串文字”。除非它的意思是说某物可以与其自身相邻,否则我认为该代码使用两个字符串文字的意图非常明确,它们在阶段 6 中连接。所以它不是一个字符串文字两次:
const char *c = "a" "a";
尽管如此,如果您确实读到“a”和“a”是相同的字符串文字,那么标准需要您正在谈论的优化。但我不认为它们是相同的文字,我认为它们是碰巧由相同字符组成的不同文字。这可能在标准的其他地方明确,例如在语法和解析的一般信息中。
无论是否明确,许多编译器编写者都按照我认为的方式解释了标准,所以我可能是对的;-)
我相信在 C/C++ 中没有针对这种情况的指定处理,但在大多数情况下会使用该字符串的多个定义。