[過去ログ]
C言語なら俺に聞け 163 (1002レス)
C言語なら俺に聞け 163 http://mevius.5ch.net/test/read.cgi/tech/1721137434/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
141: デフォルトの名無しさん (ワッチョイ a6e1-865n) [sage] 2024/09/14(土) 13:32:49.89 ID:0gsw2riP0 >>140 1は破棄されて"hoge"は破棄されないんだろ? だから参照されてんじゃん http://mevius.5ch.net/test/read.cgi/tech/1721137434/141
142: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-hr+9) [sage] 2024/09/14(土) 13:40:20.14 ID:N2YvcTj50 >>141 >>122 の bar が参照しているのは文字列リテラルからコピーされた配列であって文字列リテラルではない。 文字列リテラルが破棄されないこととは独立した話だよ。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/142
143: デフォルトの名無しさん (ワッチョイ a6e1-865n) [sage] 2024/09/14(土) 13:43:47.04 ID:0gsw2riP0 >>142 barは配列のコピーじゃないだろ ポインターなんだから コピーしてるのはアドレス値だぞ http://mevius.5ch.net/test/read.cgi/tech/1721137434/143
144: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-hr+9) [sage] 2024/09/14(土) 13:55:39.65 ID:N2YvcTj50 >>143 そのポインタが指しているという意味で参照してると言ってる。 なにを言いたいんだ? 論点は「配列の初期化子として現れる文字列リテラルは配列の初期化以外に使われる可能性がない」という話だろ。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/144
145: デフォルトの名無しさん (ワッチョイ 6663-QZ+t) [sage] 2024/09/14(土) 14:05:45.99 ID:8t7wdnSS0 > char foo[] = "hoge"; > char* bar = &foo[1]; /* 敢えてずらしてみる */ > bar が参照しているのは文字列リテラルからコピーされた配列であって文字列リテラルではない。 説明がよく分からないが、barは、fooではなく、どこかにコピーした別の文字列なり配列を参照していると言うことか? http://mevius.5ch.net/test/read.cgi/tech/1721137434/145
146: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-IU9Y) [sage] 2024/09/14(土) 14:20:52.41 ID:N2YvcTj50 >>145 bar はどうでもいいよ。 それは要らん間接参照を入れて例としてよくわからんようになってるから 飛び飛びになってる私の書いてることをあらためてまとめると ・ char foo[] = "hoge"; といったような記述があれば "hoge" によって foo を初期化する。 ・ このときの文字列リテラル "hoge" は foo を初期化するだけに使われて他からアクセスされる可能性がない。 ・ 言語規格の建前上は文字列リテラル
の寿命はプログラムの最初から最後までだが…… ・ この場合は他からアクセスされる可能性がないから機械語レベルでは文字列リテラルは最適化で消えて (即値としてコードに埋め込んで) も問題にならない。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/146
147: デフォルトの名無しさん (ブーイモ MM0a-bJfQ) [sage] 2024/09/14(土) 16:37:38.90 ID:kHQOYHTcM つまり >>118 でgccが文字列を即値にする最適化の条件を推察したら はちみつ餃子が規格の観点で説明が不適切ってぼこってるわけか? 前者の情報のほうが有益だわ http://mevius.5ch.net/test/read.cgi/tech/1721137434/147
148: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-hr+9) [sage] 2024/09/14(土) 16:47:20.53 ID:N2YvcTj50 >>147 補足したつもりだが。 どう最適化するにしても規格に反する挙動にしてはならない (したら規格に対応しているとは名乗れない) からどうしてそれで規格に反しないのかの観点から説明した。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/148
149: デフォルトの名無しさん (ワッチョイ 8af5-/VPw) [sage] 2024/09/14(土) 17:01:46.57 ID:5H/bnNk90 最適化でどうなるかを考えながらC書くくらいならもうアセンブリ書いたほうが良いと思う http://mevius.5ch.net/test/read.cgi/tech/1721137434/149
150: デフォルトの名無しさん (ワッチョイ a6e1-865n) [sage] 2024/09/14(土) 17:07:34.51 ID:0gsw2riP0 >>146 はちみつは文字列リテラルがアセンブリソースの段階で"hoge"と書かれてなければ消えてると思ってんだなw 例え命令コードの即値で書かれていても消えてる訳じゃないからー!残念! だから話が噛み合わなかったんだw まぁ強いて言えば、最適化でデータの表現法方を変えても構わないって言えば良い http://mevius.5ch.net/test/read.cgi/tech/1721137434/150
151: デフォルトの名無しさん (ワッチョイ a6e1-865n) [sage] 2024/09/14(土) 17:14:48.19 ID:0gsw2riP0 x = 1; ← 最適化で消えても構わない x = 2; 最適化で消えても構わないってこういうことを言うんだよ char foo[] = "hoge"; "hoge"は消えて良い訳ないだろw gccは実際、命令コードに文字列を埋め込んでスタックに生成してるが、その文字列はポインター変数を使えば参照可能だ http://mevius.5ch.net/test/read.cgi/tech/1721137434/151
152: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-IU9Y) [sage] 2024/09/14(土) 17:26:48.38 ID:N2YvcTj50 >>149 それはそう。 原則としては言語の理屈に従っておくのが良い。 繰り返すけど、少なくとも初心者に対して低レイヤの観点で C を説明するのは筋が悪いと思う。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/152
153: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-IU9Y) [sage] 2024/09/14(土) 17:33:13.32 ID:N2YvcTj50 >>151 > 参照可能だ その時参照してるのはスタック上にある配列であって、文字列リテラルではないってのを俺は何度書けばいいんだ? 文字列リテラルは本来は「プログラムの開始から終わりまでの寿命を持つオブジェクト」としてあらねばならないのが、 実際には文字列リテラルではない形になってることを「消えてる」と表現したのは確かに微妙な表現だったかもしれないが、 有るべき場所から消えてるんだからそんくらいわかるだろ。 そ
もそも最初は char* foo = "hoge"; との対比で言ってたんだから。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/153
154: デフォルトの名無しさん (ワッチョイ 8a56-/VPw) [sage] 2024/09/14(土) 18:13:05.20 ID:5H/bnNk90 はちみつ餃子の説明はたぶん、C++ の考え方が混ざっていないか C で配列の初期化子に文字列リテラルが書けるのはあくまで文字列リテラル限定であって、それは式として扱われるのではなく、lvalue も rvalue もクソもないということだと思うが http://mevius.5ch.net/test/read.cgi/tech/1721137434/154
155: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-IU9Y) [sage] 2024/09/14(土) 18:35:19.29 ID:N2YvcTj50 >>154 初期化子の文法の一部であって式の規則の適用範囲外じゃないの?ってことだよね? 6.7.8 を見てこの場合でも式だと解釈してるけど、そういわれたらちょっと自信がないかも。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/155
156: デフォルトの名無しさん (ワッチョイ a6e1-865n) [sage] 2024/09/14(土) 18:53:38.72 ID:0gsw2riP0 >>153 その配列に格納されているデータが文字列リテラルから生成された文字列(の実体)だろ 厳密に言いたいなら、文字列リテラルはコンパイル時に存在さえしてれば良いものなんだよ 何しろ「リテラル」だから それを生存期間だの実行時の実体とごっちゃにしてるから訳分かんないことになんだよ コンパイル時にさえ存在してれば良いという事を実行時には消えてても良いとか言っちゃってんでしょ? http://mevius.5ch.net/test/read.cgi/tech/172
1137434/156
157: デフォルトの名無しさん (ワッチョイ a6e1-865n) [sage] 2024/09/14(土) 19:03:33.67 ID:0gsw2riP0 char foo[] = { 'h', 'o', 'g', 'e', 0 }; 文字列リテラルは↑のシンタックスシュガーだ 初期化子は消えても構わないのか? 初期化子が生成した文字列は参照出来ないと言うのか? http://mevius.5ch.net/test/read.cgi/tech/1721137434/157
158: デフォルトの名無しさん (ワッチョイ 8a56-/VPw) [sage] 2024/09/14(土) 19:10:37.88 ID:5H/bnNk90 >>155 https://en.cppreference.com/w/c/language/array_initialization ここ参考にしてたから文法定義の時点で式じゃないと思ってたけど、ちゃんと規格上は式としてのパースではあったね、すまない 改めて C99(でいいんだよね、6.7.8 ってことは)の draft 読んでみたけど、文字列リテラルで初期化できるのは 6.7.8.14,15 で特殊に定義された意味論であって、やっぱり式扱いじゃないんじゃないかね http://mevius.5ch.net/test/read.cgi/tec
h/1721137434/158
159: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-hr+9) [sage] 2024/09/14(土) 19:58:20.45 ID:N2YvcTj50 >>154 結果的な挙動からするとどっちでも良いから書いてないだけかも。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/159
160: デフォルトの名無しさん (ワッチョイ 6663-QZ+t) [sage] 2024/09/14(土) 20:16:47.07 ID:8t7wdnSS0 皆拘らずに使っているのに言うのもあれなんだが C言語にはC++で言う参照はありません http://mevius.5ch.net/test/read.cgi/tech/1721137434/160
161: デフォルトの名無しさん (ワッチョイ a6b2-Z1Qu) [sage] 2024/09/14(土) 21:01:12.02 ID:NQ2pFzob0 hogeは破棄されないって一人がんばってるID:0gsw2riP0を救済して差し上げたいが……自分も完全にわかってないのでできない。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/161
162: デフォルトの名無しさん (ワッチョイ 65cd-RtM0) [sage] 2024/09/14(土) 21:04:22.62 ID:tDLmxNl+0 実在するのはfoo[]だけで 文字列"hoge"は破壊どころか最初からあっても無くてもいいというのがここまでにわかったことだろ http://mevius.5ch.net/test/read.cgi/tech/1721137434/162
163: デフォルトの名無しさん (ワッチョイ 7910-VVra) [] 2024/09/14(土) 22:15:49.35 ID:zMI9sEnq0 配列と別に文字列もどこか別に確保しといて何の意味があるんだよ この形で配列作る度に二倍メモリ食うことになるじゃないか http://mevius.5ch.net/test/read.cgi/tech/1721137434/163
164: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-IU9Y) [sage] 2024/09/14(土) 22:32:05.03 ID:N2YvcTj50 >>163 せやで。 だから最適化の余地があるという話をしてる。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/164
165: デフォルトの名無しさん (ワッチョイ 6663-QZ+t) [sage] 2024/09/14(土) 22:34:31.27 ID:8t7wdnSS0 ここで最適化の話は混ぜない方が良い http://mevius.5ch.net/test/read.cgi/tech/1721137434/165
166: デフォルトの名無しさん (ワッチョイ a6e1-865n) [sage] 2024/09/14(土) 23:00:09.33 ID:0gsw2riP0 >>163 clangは配列でも文字列リテラルは残ってるよ ここって想像だけで語るアホばっかだなw リテラルはコンパイル時のみに必要 それとは別に実行時にリテラルを実体化した値が存在する 基本的にrvalueだ でないと当然初期化が出来ない この値をはちみつは無視して語っている http://mevius.5ch.net/test/read.cgi/tech/1721137434/166
167: デフォルトの名無しさん (ワッチョイ a6e1-865n) [sage] 2024/09/14(土) 23:04:40.23 ID:0gsw2riP0 はちみつはリテラルはコンパイル時にのみ必要な事と、実行時には必要な初期値(rvalue)を最適化で命令コードに埋め込む事を消えたと表現して、ごっちゃにしてるアホ これが結論 http://mevius.5ch.net/test/read.cgi/tech/1721137434/167
168: デフォルトの名無しさん (ワッチョイ a6e1-865n) [sage] 2024/09/14(土) 23:11:36.67 ID:0gsw2riP0 リテラルは参照されないと言ってるのがその証拠 そりゃコンパイル時にのみに必要なその場でデータ構造を表現するリテラルを、実行時に参照出来る訳ないだろw それが出来るのはコードをデータとして表現してるLisp だけだ C++のテンプレートでも無理 C++のconstevalなら可能になった std::formatはそれで実装可能になった 実行時には初期化の為のrvalueが絶対に存在する http://mevius.5ch.net/test/read.cgi/tech/1721137434/168
169: デフォルトの名無しさん (ワッチョイ a6e1-865n) [sage] 2024/09/14(土) 23:13:53.14 ID:0gsw2riP0 constevalも文字列リテラルを参照可能なのはコンパイル時のみだった… やっぱり真に実行時に文字列リテラルを参照可能なのはLisp だけだな http://mevius.5ch.net/test/read.cgi/tech/1721137434/169
170: デフォルトの名無しさん (ワッチョイ 8a56-/VPw) [sage] 2024/09/14(土) 23:40:13.14 ID:5H/bnNk90 >>1 の C17 ドラフトのリンク C++17 のやつじゃん 次スレ立てるならこれに変えといて https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf http://mevius.5ch.net/test/read.cgi/tech/1721137434/170
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 832 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.012s