- 締切済み
テキストセグメントについて
セグメントの質問なのですが文字列の場合ヒープではなくてテキストセグメントに保存されるのではなかったでしたっけ?
- みんなの回答 (5)
- 専門家の回答
みんなの回答
VC++が規定でリテラルを入れる.rdataセクションはヒープではないけれどもPAGE_EXECUTE_READWRITEではないという意味でテキストセグメントでもないなあ
- jacta
- ベストアンサー率26% (845/3158)
まずは言語を明確にしてください。 次に、処理系を明確にしてください(翻訳処理系・実行処理系とも)。 そして、翻訳に指定するオプション等の情報をすべて明確にしてください。 さらに、「文字列」が何を指すのかを明確にしてください。 最後に、その「文字列」が現れる文脈を明確にしてください。
お礼
言語はC言語、処理系はvisualC++、文字列は文字列リテラルです。
- Tacosan
- ベストアンサー率23% (3656/15482)
処理系が特定されていないので規格の話とします. 「ヒープ」って何? 「テキストセグメント」って何? 特定の処理系が特定の作業をするために「ヒープ」あるいは「テキストセグメント」と呼称されるメモリ領域を使うことはあるかもしれませんが, そのようなことは C/C++ の規格で規定されているものではありません. そもそも規格レベルだと「引数をスタックに積んで関数を呼び出す」がアウトなんだよなぁ....
お礼
回答ありがとうございます。
- Yune-Kichi
- ベストアンサー率74% (465/626)
仕様上「テキストセグメント」なる言葉も「ヒープ」なる言葉も, 少なくとも文字列に関わる場所ではでてきません。 文字列定数は静的記憶域期間を持つオブジェクトとして処理され, char * / wchar_t *は静的・自動・割付のどれかの記憶域期間を持つchar/wchar_tへの配列のオブジェクトを参照し, std::basic_stringはおそらく内部で割付記憶域期間を持つオブジェクトを参照するcharTへのポインタを保持しているでしょう。
お礼
回答ありがとうございます。std::stringはポインタなのですね。わかりました。ありがとうございました。
- beefisdead
- ベストアンサー率63% (92/145)
テキストセグメントってのは実行時のメモリの区分で、基本的にはプログラムが乗る部分のことですね。読み込み・実行が(通常)可能で、書き込みは(通常)不可。実行ファイル(及び動的ライブラリ)の該当セクションのデータがだいたいそのまま乗っかります。 静的な文字列なら.rodataセクションに乗ってたと思います。rodataはテキストセグメントにマッピングされますね。 いっぽうで、実行時に作成される文字列は実行ファイルに載せようがないので、テキストセグメントには乗りません。実行時にヒープに確保されることになります。 で、私はC++には疎いのですが、stringオブジェクトを確保した場合はそのオブジェクトはヒープ領域に作られるんではないでしょうか? ソースコードに書かれている文字列であれば、char列自体は静的に確保されていると思いますが、オブジェクト自体はヒープに確保されるんではないかと思います。
お礼
回答ありがとうございます。 それで質問なのですが <実行に作成される文字列は実行ファイルに載せようがないので、テキストセグメントには乗りません。 実行時に作成される文字列とはどういった時なのでしょうか?あと静的な文字列とはどういうものなのでしょうか?質問ばかりですみません。
お礼
回答ありがとうございます。では何なのでしょうか?
補足
あともう1つなんですが、rdataセクションってなんでしょうか?質問ばかりですみません。