c ++为什么在将字符串文字传递给函数时会分配内存?

时间:2011-05-30 10:52:52

标签: c++ string memory-management

我有他的代码:

int setAttrib(const string& name, int components){    
    // here I don't even touch 'name'
    if(components == 2) return 3;
    else return 1;
}

我用这种方式调用函数:

setAttrib("position", 3);

我正在使用xcode profiler分析内存,在函数调用中,std :: string正在进行分配 那是为什么?

修改

避免这种分配的最佳方法是什么?因为我称这个函数很多,并且在大约10秒钟内我最终在该行中分配了大约10MB。

感谢。

3 个答案:

答案 0 :(得分:13)

您要求const string&,但要传递const char*。因此编译器需要创建一个正确类型的临时对象。

"position"不是std::string而是char const*的事实更像是历史事故(从C继承,当C ++中没有string类时)但不是设计决定,但要注意的是。

答案 1 :(得分:6)

因为std::string通常会分配堆内存来保存字符串。在这种情况下,std::string是从字符串文字(它本身驻留在静态存储中)隐式构造的。一些字符串实现使用一个小缓冲区来提供小字符串,但这似乎并非如此,并且依赖于实现。

name未被使用并不重要 - 基本上,setAttrib("position", 3)setAttrib(std::string("position"), 3);的简写,所以当控件进入setAttrib时,内存已经被分配(当然,在您的隔离代码示例中,编译器可以内联getAttrib然后删除字符串结构,但这是编译器优化,而不是语言功能。)

请注意,函数调用期间创建的临时对象会在函数返回时自动销毁,因此没有内存泄漏。

答案 2 :(得分:5)

为了调用函数,编译器需要构造 所有参数 ,包括const string& name,这是你的唯一方法(通过一个字符串文字而不是)构造一个临时的std::string,这需要在大多数实现中分配堆内存。如果使用函数内部的值,则无关紧要。