アプリ版:「スタンプのみでお礼する」機能のリリースについて

セグメントの質問なのですが文字列の場合ヒープではなくてテキストセグメントに保存されるのではなかったでしたっけ?

A 回答 (5件)

テキストセグメントってのは実行時のメモリの区分で、基本的にはプログラムが乗る部分のことですね。

読み込み・実行が(通常)可能で、書き込みは(通常)不可。実行ファイル(及び動的ライブラリ)の該当セクションのデータがだいたいそのまま乗っかります。

静的な文字列なら.rodataセクションに乗ってたと思います。rodataはテキストセグメントにマッピングされますね。
いっぽうで、実行時に作成される文字列は実行ファイルに載せようがないので、テキストセグメントには乗りません。実行時にヒープに確保されることになります。

で、私はC++には疎いのですが、stringオブジェクトを確保した場合はそのオブジェクトはヒープ領域に作られるんではないでしょうか?
ソースコードに書かれている文字列であれば、char列自体は静的に確保されていると思いますが、オブジェクト自体はヒープに確保されるんではないかと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
それで質問なのですが
<実行に作成される文字列は実行ファイルに載せようがないので、テキストセグメントには乗りません。
実行時に作成される文字列とはどういった時なのでしょうか?あと静的な文字列とはどういうものなのでしょうか?質問ばかりですみません。

お礼日時:2009/04/24 16:58

仕様上「テキストセグメント」なる言葉も「ヒープ」なる言葉も,


少なくとも文字列に関わる場所ではでてきません。

文字列定数は静的記憶域期間を持つオブジェクトとして処理され,
char * / wchar_t *は静的・自動・割付のどれかの記憶域期間を持つchar/wchar_tへの配列のオブジェクトを参照し,
std::basic_stringはおそらく内部で割付記憶域期間を持つオブジェクトを参照するcharTへのポインタを保持しているでしょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。std::stringはポインタなのですね。わかりました。ありがとうございました。

お礼日時:2009/04/24 17:12

処理系が特定されていないので規格の話とします.


「ヒープ」って何? 「テキストセグメント」って何?
特定の処理系が特定の作業をするために「ヒープ」あるいは「テキストセグメント」と呼称されるメモリ領域を使うことはあるかもしれませんが, そのようなことは C/C++ の規格で規定されているものではありません.
そもそも規格レベルだと「引数をスタックに積んで関数を呼び出す」がアウトなんだよなぁ....
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お礼日時:2009/04/24 17:14

まずは言語を明確にしてください。


次に、処理系を明確にしてください(翻訳処理系・実行処理系とも)。
そして、翻訳に指定するオプション等の情報をすべて明確にしてください。
さらに、「文字列」が何を指すのかを明確にしてください。
最後に、その「文字列」が現れる文脈を明確にしてください。
    • good
    • 0
この回答へのお礼

言語はC言語、処理系はvisualC++、文字列は文字列リテラルです。

お礼日時:2009/04/24 16:47

VC++が規定でリテラルを入れる.rdataセクションはヒープではないけれどもPAGE_EXECUTE_READWRITEではない

という意味でテキストセグメントでもないなあ

この回答への補足

あともう1つなんですが、rdataセクションってなんでしょうか?質問ばかりですみません。

補足日時:2009/04/24 18:05
    • good
    • 0
この回答へのお礼

回答ありがとうございます。では何なのでしょうか?

お礼日時:2009/04/24 17:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!