【问题标题】:Strings in static memory instances count静态内存实例中的字符串计数
【发布时间】:2013-07-28 09:07:15
【问题描述】:
据我所知,编译时类 C 字符串仅作为一个实例保存在静态内存中。例如,我在下面的 gcc 4.6 运行示例中同时获得了 true。但我想知道它是否总是真实的并且可以携带。 C 和 C++ 上的行为都很有趣。
#include <iostream>
bool amIportable(const char* value) {
const char* slocal = "Hello";
return (slocal==value);
}
int main() {
const char* s = "Hello";
std::cout << std::boolalpha
<< amIportable(s) << '\n'
<< amIportable("Hello") << '\n';
}
【问题讨论】:
标签:
c++
c
string
memory
static
【解决方案1】:
不,这并不总是正确的,也不是可移植的。
合并相同的字符串文字是由编译器和链接器共同执行的优化。 GCC 和 Microsoft 的编译器的最新版本都支持它,但仅在设置了某些优化开关时才支持。
而且它不仅仅是一个“开”或“关”的功能。不同的编译器和不同的优化设置也会影响积极的执行方式。例如,有时字符串文字仅在单个函数的范围内进行池化,有时它发生在翻译单元级别,还有一些时候链接器可能会参与跨多个翻译单元的操作。
这是允许的,因为 C 和 C++ 标准将此行为视为依赖于实现。
【解决方案2】:
不,它依赖于 C 和 C++ 的实现。
C11 §6.4.5/7 字符串字面量
如果这些数组的元素具有适当的值,则未指定这些数组是否不同。如果程序尝试修改这样的数组,则行为未定义。
C++11 §2.14.5/12 字符串字面量
是否所有字符串文字都是不同的(即存储在不重叠的对象中)是由实现定义的。尝试修改字符串文字的效果是不确定的。
【解决方案3】:
但我想知道它总是正确的
不,至少 C 标准说“两个相同的字符串文字是否存储在同一个数组中是实现定义的”。
【解决方案4】:
您正在比较两个不同的字符串文字,这恰好发生在
具有相同的价值。根据 C++ 标准,它是
实现定义了相同的字符串文字是否占据
相同的内存与否(这意味着实现必须
记录它的作用);根据 C 标准,它是
未指定。 (我认为 C++ 标准将允许
实现按照“字符串”的方式记录某些内容
相同内容的文字共享相同的实例,如果它们
在同一个翻译单元中,并且不共享相同的
否则实例。)
如果您的目标是能够比较指针,通常
解决方案是使用一个函数(如果它是类成员,则为静态)
它返回字符串文字:
char const*
value()
{
return "Hello";
}
bool
isHello( char const* str )
{
return str == valule;
}
然后确保字符串的所有实例都是通过
打电话给value()。