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

问题描述

| 我有他的代码
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。 谢谢。     

解决方法

        您要价2英镑,但要价3英镑。因此,编译器需要创建正确类型的临时对象。
\"position\"
不是an5ѭ而是
char const*
这一事实更多的是历史性的错误(从C继承,当C ++中没有
string
类时),而不是设计决策,但这仍然是要记住的事情。     ,        因为ѭ5通常会分配堆内存来容纳字符串。在这种情况下,“ 5”是由字符串文字隐式构造的(字符串本身位于静态存储器中)。一些字符串实现使用一个小的缓冲区来服务小字符串,但是这里似乎不是这种情况,并且还是依赖于实现的。 不用
name
没关系-basically11ѭ是
setAttrib(std::string(\"position\"),3);
的简写,因此当控制进入
setAttrib
时,内存已经分配了(当然,在您隔离的代码示例中,编译器可以内联
getAttrib
,然后完全删除字符串构造,但这是编译器优化,不是语言功能)。 请注意,在函数调用期间创建的临时对象将在函数返回时自动销毁,因此不会发生内存泄漏。     ,        为了调用该函数,编译器需要构造所有参数,包括
const string& name
,在这种情况下(传递字符串文字)的唯一方法是构造一个临时的
std::string
,这在大多数实现中都需要分配堆内存。是否使用函数内部的值都没有关系。