1

如果我调用像 myObj.setType("fluid"); 这样的函数 在一个程序中,有多少次文字“流体”的副本保存在内存中?编译器能否识别出这个文字已经定义并再次引用它?

4

6 回答 6

15

这与 C++(语言)无关。相反,它是编译器可以做的“优化”。因此,答案,取决于您使用的编译器/平台。

@David 这是来自该语言的最新草案

§ 2.14.6(第 28 页)

是否所有字符串文字都是不同的(即,存储在非重叠对象中)是 实现定义的。尝试修改字符串文字的效果是未定义的。

重点是我的。

换句话说,C++ 中的字符串文字是不可变的,因为修改字符串文字是未定义的行为。因此,编译器是免费的,以消除冗余副本。

顺便说一句,我说的只是 C++ ;)

于 2009-12-08T22:32:14.293 回答
6

是的,它可以。当然,这取决于编译器。对于 VC++,它甚至是可配置的:

http://msdn.microsoft.com/en-us/library/s0s0asdt(VS.80).aspx

于 2009-12-08T22:32:33.470 回答
4

是的,它可以,但不能保证它会。如果您想确定,请定义一个常数。

于 2009-12-08T22:32:26.913 回答
1

这是一个编译器实现问题。我使用的许多编译器都可以选择共享或合并重复的字符串文字。允许重复的字符串文字会加快编译过程,但会产生更大的可执行文件。

于 2009-12-08T23:31:35.417 回答
0

2.13.4/2:“是否所有字符串文字都是不同的(即存储在不重叠的对象中)是实现定义的”。

这允许您询问的优化。

顺便说一句,至少在标准的该部分中,可能存在轻微的歧义。字符串文字的定义对我来说并不太清楚,以下代码是两次使用一个字符串文字,还是每次使用两个字符串文字:

const char *a = "";
const char *b = "";

但是下一段说“在翻译阶段 6 中,连接了相邻的窄字符串文字”。除非它的意思是说某物可以与其自身相邻,否则我认为该代码使用两个字符串文字的意图非常明确,它们在阶段 6 中连接。所以它不是一个字符串文字两次:

const char *c = "a" "a";

尽管如此,如果您确实读到“a”和“a”是相同的字符串文字,那么标准需要您正在谈论的优化。但我不认为它们是相同的文字,我认为它们是碰巧由相同字符组成的不同文字。这可能在标准的其他地方明确,例如在语法和解析的一般信息中。

无论是否明确,许多编译器编写者都按照我认为的方式解释了标准,所以我可能是对的;-)

于 2009-12-08T22:51:50.010 回答
0

我相信在 C/C++ 中没有针对这种情况的指定处理,但在大多数情况下会使用该字符串的多个定义。

于 2009-12-08T22:32:45.857 回答