如果我调用一个函数,如 myObj.setType(“fluid”); 多次在一个程序中,多少个文字“流体”的副本被保存在内存中?编译器是否可以识别出这个文字已经被定义并且只是再次引用它?(c/C++)在文本部分做字符串文本共享内存的副本?
回答
我相信,在C/C++没有该情况下,没有指定的处理,但在大多数情况下会使用该字符串的多个定义。
该标准不要求或排除interned字符串。 Meyers谈论了Interceptor对象在_Effective C++ _中的问题(它实际上可能在_More Effective C++ _中)。 – KitsuneYMG 2009-12-09 04:39:34
这与C++(语言)无关。相反,它是编译器可以执行的“优化”。所以,答案是和否,这取决于您使用的编译器/平台。
@大卫这是从latest draft of the language:
§2.14.6(第28页)
是否所有字符串文字是 不同(即,存储在非 重叠对象)是 实现定义。试图修改字符串文字 的 的效果是undefined。
重点是我的。
换句话说,C++中的字符串文字是不可变的,因为修改字符串文字是未定义的行为。所以,编译器是免费的,以消除多余的副本。
BTW,我只谈论C++)
如今,字符串文字“重叠”是否是_unspecified_。 – 2017-05-25 19:00:33
是的,可以,但不能保证它会的。定义一个常数,如果你想确定。
+1我会补充说“定义一个常量”意味着'const char cst [] =“foo”;'。 “定义”这个词可能会引起错误的想法。 – 2009-12-08 22:37:01
是的,它可以。当然,这取决于编译器。对于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";
不过,如果你读过“一”和“一个”是相同字符串字面量,那么标准要求你在谈论的最优化。但我不认为它们是相同的字面意思,我认为它们是不同的文字,恰好由相同的字符组成。这在标准的其他地方可能已经明确,例如在关于语法和解析的一般信息中。
无论是明确与否,许多编译器作家解释的标准,我认为它是这样的,所以我也可能是正确的;-)
这是一个编译器的实现问题。我用过的许多编译器都可以选择共享或合并重复的字符串文字。允许重复的字符串文字加快编译过程,但会产生更大的可执行文件。
- 1. 在物理内存中如何避免共享库文本部分的多个副本?
- 2. 结合文本字符串公共部分的代码
- 3. 制作共享副本ios
- 4. Android接收共享文本文件但不共享文本内容
- 5. 如何声明公共字符串文本框的文本
- 6. 无法创建本地化字符串的文件副本XCode4
- 7. 为本地字符串文字分配内存吗?
- 8. Android编辑文本文件并将字符串保存到共享首选项
- 9. 共享内存和运行可执行文件的多个副本
- 10. 文本字符串
- 11. 将字符串分成3列:文本,数字,文本
- 12. 创建JSON - 部分循环,部分纯文本字符串
- 13. 从全局到本地内存的OpenCL副本字符
- 14. Streamread将文本文件的一部分写入字符串
- 15. 替换字符串文本文件的某些部分
- 16. php内的文本字符串
- 17. 在文本字符串中/内部乘以数字。 +综述
- 18. 用文本字符串的一部分替换整个文本SQL
- 19. 加载共享库的多个副本
- 20. Facebook分享文本
- 21. 在PHP中删除文本字符串的一部分
- 22. 阅读文件,并在CMD做副本
- 23. android:文本分配字符串资源和文本
- 24. Powershell - 在文本文件的开头添加文本字符串
- 25. 共享内存和字符串:托管?
- 26. 文本繁重的网站如何在内部存储文本?
- 27. XSLT - 通过分析文本字符串
- 28. {PHP}分割文本字符串
- 29. 拆分文本(字符串)投票
- 30. 在VSTS版本之间共享内部版本号
如果你多次使用“流体”,也许你应该定义一个常量并引用常量而不是文字? – FrustratedWithFormsDesigner 2009-12-08 22:31:21
如何编写一个小测试,通过比较不同文字指向的位置来检查这一点? – 2009-12-08 22:33:02
呵呵,关于这个标题,很多链接器都会识别一个'.rodata',其中(例如)文字串属于。理论上'.text'应该保留给代码,尽管滥用是普遍的 - 也许是出于历史原因。 – 2009-12-08 22:41:08