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

c++ Why is memory allocated when passing a string literal to a function?

本文关键字:函数 内存 分配 为什么 字符串 文本 c++      更新时间:2023-10-16

我有他的代码:

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探查器分析内存,在函数调用std::string中进行分配
为什么?

编辑:

避免这种分配的最佳方法是什么?因为我经常调用这个函数,在大约10秒内,我最终在该行中分配了大约10MB。

谢谢。

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

"position"不是std::string而是char const*这一事实与其说是一个设计决策,不如说是一次历史事故(继承自C,当时C++中没有string类),但还是要记住这一点。

因为std::string通常会分配堆内存来保存字符串。在这种情况下,std::string是由字符串文字(其本身位于静态存储中)隐式构造的。有些字符串实现使用小缓冲区来提供小字符串,但这里的情况似乎并非如此,而且无论如何都依赖于实现。

不使用name并不重要——基本上,setAttrib("position", 3)setAttrib(std::string("position"), 3);的缩写,所以当控件进入setAttrib时,内存已经分配好了(当然,在您的独立代码示例中,编译器可以内联getAttrib,然后完全放弃字符串构造,但这是编译器的优化,而不是语言功能)。

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

为了调用函数,编译器需要构造所有参数,包括const string& name,在您的情况下,唯一的方法(而是传递字符串文字)是构造临时std::string,这在大多数实现中需要堆内存分配。是否在函数中使用该值并不重要。