我有一个简单的程序:
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
string read0() {
int length = 4;
char *cstr = new char[length];
string str(cstr);
delete[] cstr;
return str;
}
string read1() {
int length = 4;
char cstr[length];
memset(cstr, '-', 4);
string str(cstr);
return str;
}
string read2() {
const char* cstr = "abcd";
string str(cstr);
return str;
}
在上述所有 3 个函数中,为了构造一个字符串,它们call basic_string( const CharT* s, const Allocator& alloc = Allocator()
. 当我使用 valgrind/massif 检查堆使用情况时,函数 read0 只使用 4 个字节(从new
),但 read1 和 read2 都使用 29 个字节。
以下是地块的一些详细输出:
对于 read0:
16.67% (4B) (堆分配函数) malloc/new/new[], --alloc-fns, etc.
-> 16.67% (4B) 0x400A0B: read0() (main.cpp:10)
-> 16.67% (4B) 0x400BC8: 主要 (main.cpp:40)
对于 read1 和 read2:
72.50% (29B) (堆分配函数) malloc/new/new[], --alloc-fns, etc.
->72.50% (29B) 0x4EE93B7: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator const&) (在 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0 .17)
->72.50% (29B) 0x4EEAD93: char* std::string::_S_construct(char const*, char const*, std::allocator const&, std::forward_iterator_tag) (在 /usr/lib/x86_64-linux-gnu /libstdc++.so.6.0.17)
->72.50% (29B) 0x4EEAE71: std::basic_string, std::allocator >::basic_string(char const*, std::allocator const&) (在 /usr/lib/x86_64-linux-gnu/libstdc++.so 中。 6.0.17)
-> 72.50% (29B) 0x400B81: read2() (main.cpp:34)
-> 72.50% (29B) 0x400BC8: 主要 (main.cpp:40)
是什么导致了这种差异?