2016-11-04 22 views
0

C++プログラムでは、定数データはどこに格納されますか?特に文字列定数ですか?文字列に反し文字列定数はどこに格納されていますか?

string_viewます、ではない:私はので、次の質問に求めています

Why can creating a static const std::string cause an exception?

デイモンによって答えを、最後に次のを持っています無定数の メモリを割り当て、それに定数データをコピーしてから、それを一定のふりをします。 代わりに、それは定数データに直接ポインタを管理し、それはすべて です。

このように、あなたの定数は正式には定数ではなく、そこには は割り当てなし、例外の可能性なし、ダブルメモリなし です。そして、ほとんどの場合、それはまだ見えて、弦のようなにおいがします。 string_viewは文字列ビューではヌル終端を保証していません(文字定数は を指していますので、これは無関係です)、実際には定数であることは は変更できません。まさにあなたが望むものです。

さらに定数をメモリに保存する必要はありません。メモリが有限であるためメモリに格納されている場合、それ以上のメモリがないために例外がスローされる可能性はありませんか?

+2

コードが実行される前に、それらのメモリがロードされます。したがって、実行時例外はありません。実行することができれば、メモリは既にそこにあります。 –

+1

関連http://stackoverflow.com/questions/349025/is-a-string-literal-in-c-created-in-static-memory https://isocpp.org/wiki/faq/ctors#static-初期注文 –

答えて

2

問題は、単なるデータではなく、std::stringがオブジェクトであるということです。

これは、あなたが

static const std::string foobar = "foobar"; 

を宣言する際にバイナリに予約されている静的データ(const char*として意図)リテラル"foobar"用とstd::stringオブジェクトを格納するために必要な空間であることを意味そのコンテンツを格納するのに必要なスペースはではないです。

はのは、これはコードの些細な危険な作品ですが、それはあなたのアイデアを与えるだけだ

class string { 
private: 
    size_t length; 
    char* data; 

public: 
    string(const char* data) : length(strlen(data), data(new char[length+1]) { 
    strcpy(this->data, data); 
    } 
    ~string() { delete data; } 
}; 

としましょう、のようなものとしてstd::stringを想像してみてください。 static std::stringがある場合、データ自体はヒープ上に動的に割り当てられるため、必要なスペースはsizeof(char*)+sizeof(size_t)バイトです。

static const std::stringを使用すると、文字列のコンストラクタに渡されるリテラル自体とstd::stringの2倍のスペースが無駄になります。

このオブジェクトはコンパイル時に "事前に構築されていません"。これは実行時に生成され、標準doesn't guaranteeが生成されます。これが起きた場合は、実際にはmainを呼び出す前にコンストラクタがスローする可能性があります。

引用さstring_viewは、それが可変であるように設計されている通常のstd::stringには当てはまらないコンテンツへのポインタだけを記憶するように廃棄メモリをdoens't const char*のラッパーです。

1

スタティック定数は、実行可能ファイルの 'data'セグメントに格納されます。正確にどこに格納されているかは、システムによって異なる場合がありますが、Linuxの場合、実行可能ファイルの一部としてロードされ、プロセスメモリマップの 'テキストセグメント'のすぐ上に表示されます。

これらは、プログラムの実行が開始される前にオペレーティングシステムによってプロセスメモリマップにロードされます。したがって、それらに十分なメモリがない場合、プログラムはロードすることすらできず、例外をスローすることはほとんどありません。

プロセスのメモリレイアウトに興味がある場合は、this blog postが最も役立つことがわかりました。

関連する問題