私は簡単なプログラムを持っています:
#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 つの関数すべてで、文字列を作成するために、 they call basic_string( const CharT* s, const Allocator& alloc = Allocator()
. valgrind/massif を使用してヒープの使用状況を確認すると、関数 read0 は (からnew
) 4 バイトしか使用しませんが、read1 と read2 は両方とも 29 バイトを使用します。
以下は、massif の詳細な出力です。
read0 の場合:
16.67% (4B) (ヒープ割り当て関数) malloc/new/new[]、--alloc-fns など
->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 など
->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)
この違いの原因は何ですか?