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