重复的常量c_strings是否重复?

时间:2017-05-25 18:28:42

标签: c++ string memory c-strings string-literals

因此,举个例子,我在程序中将字符串传递给方法。

someMethod(“你好世界”);

在编译时,我假设文字,“Hello world”被认为是常量而没有直接声明它。

如果它确实将其识别为常量,它是否将重复项存储为相同的地址?

更具体地说是c ++ 11?

所以,让我们有一个案例场景,让我说我用一个Object to String List填充一个地图。

map<std::string,Shader> list;
list["shaders/sprite.vs"] = Shader("shaders/sprite.vs");
... (Sometime later in another file)
//Some call that needs a shader, that I have stored in a map.
SomeGLFunction("shaders/sprite.vs");

原谅显然需要使用变量来保存它。

如果没有“/ GF”的编译器选项来启用字符串池,编译器通常会将所有三个文字分开存储并单独存储?

2 个答案:

答案 0 :(得分:2)

来自C ++标准(2.13.5字符串文字)

  

16评估字符串文字会产生字符串文字对象   静态存储持续时间,从给定字符初始化为   如上所述。 是否所有字符串文字都是不同的(即,   存储在非重叠对象中)以及是否连续   对字符串文字的评估产生相同或不同的对象   未指明

因此,实现定义了相同的字符串文字是否是不同的对象。通常它取决于编译器选项。

如果您有这样的电话

someMethod("hello World");

在循环中然后只使用一个字符串文字。因此,函数将在循环的每次迭代中获得字符串文字的第一个字符的相同地址。

但是如果你要写

if ( "hello World" == "hello World" )
{
    //...
}

然后条件可以产生true或false,具体取决于相应的编译器选项。

答案 1 :(得分:-1)

也许。编译器应该这样做。它没有。