[過去ログ] C言語なら俺に聞け 163 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
161: (ワッチョイ a6b2-Z1Qu) 2024/09/14(土)21:01 ID:NQ2pFzob0(1) AAS
hogeは破棄されないって一人がんばってるID:0gsw2riP0を救済して差し上げたいが……自分も完全にわかってないのでできない。
162: (ワッチョイ 65cd-RtM0) 2024/09/14(土)21:04 ID:tDLmxNl+0(1) AAS
実在するのはfoo[]だけで
文字列"hoge"は破壊どころか最初からあっても無くてもいいというのがここまでにわかったことだろ
163(3): (ワッチョイ 7910-VVra) 2024/09/14(土)22:15 ID:zMI9sEnq0(1) AAS
配列と別に文字列もどこか別に確保しといて何の意味があるんだよ
この形で配列作る度に二倍メモリ食うことになるじゃないか
164: はちみつ餃子◆8X2XSCHEME (ワッチョイ 7932-IU9Y) 2024/09/14(土)22:32 ID:N2YvcTj50(13/14) AAS
>>163
せやで。 だから最適化の余地があるという話をしてる。
165: (ワッチョイ 6663-QZ+t) 2024/09/14(土)22:34 ID:8t7wdnSS0(4/4) AAS
ここで最適化の話は混ぜない方が良い
166: (ワッチョイ a6e1-865n) 2024/09/14(土)23:00 ID:0gsw2riP0(9/12) AAS
>>163
clangは配列でも文字列リテラルは残ってるよ
ここって想像だけで語るアホばっかだなw
リテラルはコンパイル時のみに必要
それとは別に実行時にリテラルを実体化した値が存在する
基本的にrvalueだ
でないと当然初期化が出来ない
この値をはちみつは無視して語っている
167(1): (ワッチョイ a6e1-865n) 2024/09/14(土)23:04 ID:0gsw2riP0(10/12) AAS
はちみつはリテラルはコンパイル時にのみ必要な事と、実行時には必要な初期値(rvalue)を最適化で命令コードに埋め込む事を消えたと表現して、ごっちゃにしてるアホ
これが結論
168(1): (ワッチョイ a6e1-865n) 2024/09/14(土)23:11 ID:0gsw2riP0(11/12) AAS
リテラルは参照されないと言ってるのがその証拠
そりゃコンパイル時にのみに必要なその場でデータ構造を表現するリテラルを、実行時に参照出来る訳ないだろw
それが出来るのはコードをデータとして表現してるLisp だけだ
C++のテンプレートでも無理
C++のconstevalなら可能になった
std::formatはそれで実装可能になった
実行時には初期化の為のrvalueが絶対に存在する
169: (ワッチョイ a6e1-865n) 2024/09/14(土)23:13 ID:0gsw2riP0(12/12) AAS
constevalも文字列リテラルを参照可能なのはコンパイル時のみだった…
やっぱり真に実行時に文字列リテラルを参照可能なのはLisp だけだな
170: (ワッチョイ 8a56-/VPw) 2024/09/14(土)23:40 ID:5H/bnNk90(4/4) AAS
>>1 の C17 ドラフトのリンク C++17 のやつじゃん
次スレ立てるならこれに変えといて
外部リンク[pdf]:web.archive.org
171(2): はちみつ餃子◆8X2XSCHEME (ワッチョイ 7932-IU9Y) 2024/09/14(土)23:53 ID:N2YvcTj50(14/14) AAS
>>167
起きていることは >>127 でこれ以上なく具体的に説明されてるんだから改めて厳密に表現しないと理解できないとは思わなかったんだよ。
>>168
文字列リテラルが静的記憶域期間を持つことは 6.4.5 に書かれてる。
実行フェイズに存在するオブジェクトだよ。 (最適化を抜きにして仕様通りに解釈すれば。)
配列の初期化子として現れる文字列リテラルの扱いは微妙かもという話が >>154 >>158 の指摘だが、
記憶域期間についての記述は文脈を指定せず文字列リテラル全部を対象にした記述に見える。
172: (ワッチョイ d7cd-qbvN) 2024/09/15(日)00:57 ID:/wZr5+b/0(1/2) AAS
>>163
そりゃ書き換える場合があるからでしょー
一個しかなかったら関数呼ばれるたびに初期値も書き換わってしまう
なんで悩んでるのこの人?
constつけたら一個ですむだろ多分
173(1): (ワッチョイ ffe1-1pYN) 2024/09/15(日)01:17 ID:STy65/7c0(1/5) AAS
>>171
> 実行フェイズに存在するオブジェクトだよ。
存在してんじゃねーかよ!
これが最適化で消えて良いかの話だよ!
gccの場合は命令コードに埋め込んでるけど、消えてる訳じゃないし、別のポインターから参照可能だ
174(3): はちみつ餃子◆8X2XSCHEME (ワッチョイ f732-vU+L) 2024/09/15(日)01:30 ID:B6k8li/O0(1/3) AAS
>>173
配列とその初期化子として現れる文字列リテラルが別の存在だってことが俺が何度も書いてることだよ。
これがそんなに何度も何度も何度も何度も書かないと理解できないようなことか?
別のポインタは配列を指せるが、その初期化子として現れる文字列リテラルを指せるわけじゃない。
char* foo = "hoge";
のようなケースではポインタ foo は文字列リテラルを指してるということと対比しての話だぞ。
175(1): (ワッチョイ ffe1-1pYN) 2024/09/15(日)01:32 ID:STy65/7c0(2/5) AAS
ちなみに「文字列リテラル」が「実行時」に存在してる訳では全くない
はちみつはそこを勘違いしてる
静的記憶期間というのはスコープの事だ
まぁエクステントと言った方が正確だが
それはコンパイラーが理解できるものだが、それと「実行時」に存在する値を結びつけてはいけないし関係無い
DLLだとしたら静的記憶期間の変数も実行時には存在しない可能性もある
スレッドローカルストレージの変数もそうだな
要するに文字列リテラルで生成されたデータは実行時には確実にアクセス可能で、消えてるなんて全くあり得ない
それをずっと言ってる
176: (ワッチョイ ffe1-1pYN) 2024/09/15(日)01:38 ID:STy65/7c0(3/5) AAS
>>174
> 文字列リテラルを指せるわけじゃない。
はい、これが間違いの全て
文字列リテラルはコンパイラーだけが理解できる「構文」に過ぎない
それを実行時にさせないとはこれいかに?w
文字列リテラルは「実行時」には何て名前になってんだ?
配列でもないぞ
配列に代入される前のrvalueの事だ
まぁ文字列は例外的にlvalueにもなれるが、rvalueであることには違いない
177(1): (ワッチョイ 9f56-3vlU) 2024/09/15(日)01:45 ID:hg9QOZOF0(1) AAS
>>171
なんかいろいろ書いたけど最終的には自分もそれで合っていると思う
実用上は正直どこで役に立つのかあまり思いつかないが、規格上どういう建て付けになってるのかはとりあえず理解できたかも
というか、実用上あんまり役に立つわけじゃないから今まで調べもしなかったというか
規格上は「リテラル」は存在せず integer/enumeration/floating/character は定数なんですね
それで定数は記憶域期間を持たない
文字列リテラルは静的記憶域期間を持つ
複合リテラルは関数本体の外か中かに応じて静的/自動記憶域期間を持つ、と
うーんでもなあ
某言語でいきなり &1 とか書けるの知ってたら別に定数にも記憶域期間持たせればいいじゃんとか思っちゃうなあ
とりあえずそうなっているというだけか
178(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ f732-vU+L) 2024/09/15(日)01:46 ID:B6k8li/O0(2/3) AAS
>>175
> 静的記憶期間というのはスコープの事
ちがう。 記憶域期間はオブジェクトの寿命の区分。
6.2.4 を参照のこと。
寿命の区分が設定されている以上はオブジェクト (メモリ上のどこかにある) のこと。
> 文字列リテラルで生成されたデータは実行時には確実にアクセス可能で、消えてるなんて全くあり得ない
関数 (C のプログラムは関数の集合なので実質的にプログラムの全て) はオブジェクトではない。
私が「消える」と表現したのはこの意識があったからだが、機械語のレベルでどこかには存在するという意味ではそりゃ存在するだろう。
(同じ内容が連続する配列だったらループで書き込むような形にすることもあるかもしれない。)
配列の初期化子としての文字列リテラルは本来あるべき場所 (オブジェクト) から最適化で消えてるし、ポインタで指すことは出来ない。
179: はちみつ餃子◆8X2XSCHEME (ワッチョイ f732-vU+L) 2024/09/15(日)01:53 ID:B6k8li/O0(3/3) AAS
>>177
C++ の右辺値参照も左辺値参照も左辺値なんだよね。
参照を経由したら左辺値になるなら最初からそう出来ないか? と思ったことはある。
180: (ワッチョイ ffe1-1pYN) 2024/09/15(日)01:58 ID:STy65/7c0(4/5) AAS
>>178
> ちがう。 記憶域期間はオブジェクトの寿命の区分。
だからエクステントと書いてんだろ!
もしかして理解出来なかったか?
> 配列の初期化子としての文字列リテラルは本来あるべき場所 (オブジェクト) から最適化で消えてるし
本来あるべき場所(オブジェクト)って何だよ?!
目茶苦茶だなw
これがコンパイラーと実行時に存在すべき値(rvalue)をごっちゃにした成れの果てだなw
181: (ワッチョイ ffe1-1pYN) 2024/09/15(日)02:33 ID:STy65/7c0(5/5) AAS
初期化に使われた(文字列)リテラルが実行時にrvalueになったものに名前を付けるべきだな
これは最適化でも消えることはない(当たり前だが…)
名前がないとまたリテラルは消えるから参照出来ない野郎が発生しかねないw
182(2): (スッップ Sdbf-2MD7) 2024/09/15(日)12:24 ID:WkBCL5VYd(1) AAS
>>174
>char* foo = "hoge";
>
>のようなケースではポインタ foo は文字列リテラルを指してる
その表現が間違ってる。
fooは静的記憶域を指してるが正しい。
intptr_t *bar = 0xAABB;
この場合数値リテラルを指すなんて言わんだろ。
183(1): 警備員[Lv.2][新芽] (ワッチョイ 5707-/vo+) 2024/09/15(日)13:50 ID:krajCak80(1) AAS
>>char* foo = "hoge";
>>
>>のようなケースではポインタ foo は文字列リテラルを指してる
>
>その表現が間違ってる。
>fooは静的記憶域を指してるが正しい。
彼も文字列リテラルは静的記憶域に置かれると言ってなかったっけ
僕にはこの2つの違いが分からないや
勘違いだったらごめんなさい
184: (ブーイモ MM8f-GITO) 2024/09/15(日)16:04 ID:7leD3hDGM(1) AAS
もっと中身のある話しようぜ
185(1): (ワッチョイ 9794-z7on) 2024/09/15(日)17:53 ID:V70NGKYC0(1) AAS
>>68
規格に後置++演算子は実数型とポインタ型にしか使えないとあったけどそれの関係じゃないの?
規格でそう決まってるだけの話では?
186: (スプッッ Sd3f-2MD7) 2024/09/15(日)18:13 ID:/tCGodXOd(1) AAS
それだな
187(1): (ワッチョイ d7cd-qbvN) 2024/09/15(日)21:42 ID:/wZr5+b/0(2/2) AAS
ちなみに
int main(int argc, char *argv[])
と定義しても
argvは++できる
188(1): (ワッチョイ ff63-y7MN) 2024/09/15(日)23:27 ID:dUpBu3ui0(1) AAS
main の引数だけど、人によって好みがある
*argv[]だったり、 **argvだったり、
さすがにargv[][]はいないと思う
189(2): はちみつ餃子◆8X2XSCHEME (ワッチョイ f732-vU+L) 2024/09/16(月)08:22 ID:JwEVxA0h0(1/6) AAS
>>185
配列はポインタに型変換される。 だから型は合うんだよ。
変更可能な左辺値でなければならないという制約に違反してる。
190(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ f732-vU+L) 2024/09/16(月)08:28 ID:JwEVxA0h0(2/6) AAS
>>182-183
静的記憶域期間ってのは静的+記憶域期間なんだよ。 静的記憶域+期間じゃないんだよ。
まあ静的記憶域期間を持つオブジェクトが配置されている場所を静的記憶域と呼んでもカジュアルな場面ではそんなに不自然ではないとは思うけど。
実装上は専用のセクションに配置するのが普通だし。
上下前次1-新書関写板覧索設栞歴
あと 812 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.017s