我有他的代码:
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。
感谢。
答案 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
,这需要在大多数实现中分配堆内存。如果使用函数内部的值,则无关紧要。