質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

2307閲覧

c言語 const定数や文字列リテラル 格納先 の ROMとは

akiyama3284pga

総合スコア186

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2022/04/25 03:01

編集2022/04/25 03:02

とある書籍に、
「文字列リテラルやconst定数は、ROMを消費する」
というような記述がありました。

これをどう解釈すべきでしょうか。

例えばlinuxでc言語の、

void main(){ char string[] = "hello"; }

を実行した場合、文字列リテラルはこのプログラム(プロセス)の仮想アドレス空間の一角(main関数のスタックフレームでもヒープでもない他のどこか)に入るのではないのか。
と考えてしまいます。
そもそもここで言うところのROMとはRAMと実体が別のものなのか...

下記のサイトでは、
https://www.dospara.co.jp/5info/cts_str_pc_ram

ROMとは、半導体などを用いた記憶素子および記憶装置の一つで、製造時などに一度だけデータを書き込むことができ、利用時には記録されたデータの読み出しのみが可能なものを呼びます。

とあります。
このROMに書き込むということなのでしょうか。

このあたり勉強不足で理解に苦しんでおります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

具体的にハードウェアのどこに対応付けなければならないということは C の言語仕様で決められてはいません。 スタックとヒープという言葉も言語仕様には現れません。 オブジェクトが維持される寿命に関しての保証 (処理系に対する要求) があるだけです。

その上で一般的な話をするのであれば、普通のパソコンでは文字列リテラル (書き換えが禁止されたオブジェクト) が割り当てられる場所は RAM と同じものです。 ただし、現代のハードウェアは様々な複雑高度な管理機構を持っていて、メモリにページ単位で属性を付けることも出来ます。 文字列リテラルを割り当てたメモリに書き込み禁止属性を付けているということはあるでしょう。

そしてもちろんハードウェア的に書き換え不可能な ROM であったとしても言語仕様的には OK です。

言語仕様とそれを実現するための仕組みは別のレイヤの話なので混同しないようにしてください。

投稿2022/04/25 03:28

SaitoAtsushi

総合スコア5466

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akiyama3284pga

2022/04/25 09:06 編集

ありがとうございます。 理解することができました。 今回の場合には筆者は組み込み系を意識したROMという使い方をしていましたが、 ページの属性に禁止属性を付けたものを役割としてROMと表現できなくもないということですね。 C言語と処理系をうまく繋げるのがOSであるLinuxなどであり、 C言語は魔法のステッキではないと...
guest

0

「文字列リテラルやconst定数は、ROMを消費する」
これをどう解釈すべきでしょうか。

「文字列リテラルを書き換えることはできない」と解釈してください。

ROMというのはハードウェアの話で、一般の人がPC上でプログラミングして実行する場合には関係ありません。
Linux の場合は文字列リテラルは rodata というセクションに配置されます。OSがプログラムをメモリにロードするとき、このセクションのメモリページには書き込みができないよう設定します。

投稿2022/04/25 03:27

int32_t

総合スコア20927

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akiyama3284pga

2022/04/25 09:00

ありがとうございます。 組み込み系をではく、普通のシステムを勉強したいので、そのように解釈したいと存じます。 組み込み系ではない普通のLinuxの場合には、定数はアドレス空間のrodataというセクションに置き、ROMのように書き込みを不可とする設定を敷いて対応していると理解できました。
guest

0

ベストアンサー

下記のいずれかです。
・その著者の勘違い
・その著者はコードセグメントないしコードブロックの事をROMと呼ぶ習慣がある
・機器組み込みプログラムなどで、プログラムがROMに書き込まれて機器に組み込まれる場合、文字列リテラルもROM領域に書き込まれると言うことの説明

投稿2022/04/25 03:26

otn

総合スコア84677

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akiyama3284pga

2022/04/25 04:38

お世話になっております。 まさに3点目のことを著者は言いたかったのではないかと感じました。 組み込みの場合、主記憶装置のみで行くケースもあると聞きましたが、 ROMを使用する場合、rom(フラッシュメモリ等)がSSDのような外部記憶装置の代わりを担うというような認識でよろしいでしょうか? それであれば、ROMを消費するという意味が分かります。 つまり、単にプログラムの容量がその分だけ増えますよということが言いたかったのか...
akiyama3284pga

2022/04/25 04:43

あとすみません。 なぜ、普通のローカル変数などはROMを消費するという中に入れていなかったのでしょうか?
otn

2022/04/25 07:01

組み込みシステムの説明の中で出てきたのならそうですね。 ROMには書き込めない(※)ので、SSDとかとは違います。 変数はRAMに置かれます。 ※「ファームウェアアップデート可能」という機器であれば、ROMの更新も可能ですが、変数に書き込むような気軽さではないですね。
akiyama3284pga

2022/04/25 08:51

ありがとうございます。 組み込み系を軽く触れた書籍ですので間違いないかと存じます。 ROMとは簡単に言えばSSD等の読み出しだけできるバージョンの外部記憶装置といった感じでしょうか... 組み込み系について少し調べてみますと、 おっしゃる通りプログラムの不変の部分は全てROMに置き、そのほかの変動するものはRAMに置くと説明がありました。 確かに、最初に一度作成したコードを変更しない前提なのが組み込み系だと思いますので、ROMにそうした不変のものを置くことはROMが書き込みが不可能であるという点と上手くマッチするため合理的なのだと理解することができました。
otn

2022/04/25 09:53

いいえ。外部記憶では無く、メモリーの一種です。CPUの実行する命令はメモリー上に無いといけないと言うことをご存じない? 電源を入れて最初に動くプログラムはROMに書いておく必要があります。PCだとBIOSとかUEFIはROMに書かれています(上に書いた「ファームウェアアップデート可能」なので更新可能ですが)。PCだとその後外部記憶からOSを読み込みます。
akiyama3284pga

2022/04/25 11:07 編集

ご訂正ありがとうございます。 CPUの実行する命令はメモリー上に無いといけないということは存じておりましたが、 少し混同してしまっていました。 ROMをメモリの一種だと理解訂正しますと、つじつまが合いました。 PCだとその後外部記憶からOSを読み込むが、組込みの場合には組込み用のLinuxやプログラム諸々、定数もROM上に置く(メモリにロードした状態にしておく)ということですね。 普通のPCだと、定数でも変数でもRAMに入るが、組込みの場合にはROMに定数を、変数をRAMに置くということをしっかり覚えておきます。
otn

2022/04/25 11:14 編集

普通のPCのように、組み込み用でないOSだと、組み込みでROMに相当するメモリエリアは、OSが書き込み禁止にします(メモリ管理ユニットにそういう指示をする)。 なので、 char *p = "abc"; p[0] = 'A'; みたいなことをするとこけます。
akiyama3284pga

2022/04/25 11:43 編集

ありがとうございます。 両者をきっちり区別することができました。 ------------------------------------------------------------------------------------------- 定数は組み込みかそうでないかで実現方法が異なる。 組み込みでない場合は、RAMのROMに相当するメモリエリアを書き込み禁止にすることで、書き込み禁止とする 組み込みの場合は、ROMに置けばROMなので必然書き込み禁止となる 「文字列リテラルやconst定数は、ROMを消費する」という意味はこういうこと。 -------------------------------------------------------------------------------------------
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問