[過去ログ]
C言語なら俺に聞け 163 (1002レス)
C言語なら俺に聞け 163 http://mevius.5ch.net/test/read.cgi/tech/1721137434/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
123: デフォルトの名無しさん (JP 0H3e-voeu) [sage] 2024/09/13(金) 17:45:50.36 ID:HymUJJD5H 短い配列文字列をポインターに代入したらレジスターに保持する最適化を諦めるかと思ったら、そうじゃなくて意地でもレジスターに保持したまま処理を進めるgccスゲーよw clangの場合はポインターも配列も常に静的に文字列を定義したものを使ってた http://mevius.5ch.net/test/read.cgi/tech/1721137434/123
124: デフォルトの名無しさん (ワッチョイ 6663-QZ+t) [sage] 2024/09/13(金) 18:12:32.57 ID:y2ap91b60 最近のCPUはレジスターに文字列格納できるんだな 何バイトくらいなら入るんだろうか http://mevius.5ch.net/test/read.cgi/tech/1721137434/124
125: デフォルトの名無しさん (JP 0H3e-voeu) [sage] 2024/09/13(金) 18:26:19.17 ID:HymUJJD5H gccの場合だと64bitだと8バイトだから最大7文字かなと思ったらレジスターを複数使ってでも載せようとしてたw 取り敢えず50文字まで試したけど全部レジスタに載ってた でもこの辺はレジスタの空き具合にもよるのか?詳しくは分からん http://mevius.5ch.net/test/read.cgi/tech/1721137434/125
126: デフォルトの名無しさん (ワッチョイ 6663-QZ+t) [sage] 2024/09/13(金) 18:41:27.03 ID:y2ap91b60 何か執念みたいなのを感じました笑 http://mevius.5ch.net/test/read.cgi/tech/1721137434/126
127: デフォルトの名無しさん (JP 0H3e-voeu) [sage] 2024/09/13(金) 18:50:06.89 ID:HymUJJD5H スマン…間違えた…orz 正確にはアセンブリコードに書かれてると言うべきだった movabsq $3833745473465760056, %rdx movabsq $3978425819141910832, %rax movq %rdx, 40(%rsp) movabsq $3544395820347831604, %rdx movq %rdx, 56(%rsp) ↑こんな感じで文字列が直値で表現されてて、スタックに積んで使ってた だったら静的に確保した方が速い気がするけど、やっぱりレジスターから直接使う事が有るのか? 取り敢えずコンパイラーが出力するコードに深入
りしない方が良いって事は分かったw http://mevius.5ch.net/test/read.cgi/tech/1721137434/127
128: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-IU9Y) [sage] 2024/09/13(金) 18:59:17.17 ID:7dvxgxgq0 >>122 その場合に参照されるのは foo であって、 "hoge" というリテラルではない。 "hoge" は foo を初期化する以外の用途に使われていない。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/128
129: デフォルトの名無しさん (ワッチョイ 65cd-RtM0) [sage] 2024/09/13(金) 20:11:25.22 ID:ykZRrldI0 >>127 データセグメントに確保するよりも コードセグメントに書いたほうがすでにキャッシュに載ってるから高速なのかもな http://mevius.5ch.net/test/read.cgi/tech/1721137434/129
130: 警備員[Lv.5][新芽] (ワッチョイ 1e21-ztXh) [sage] 2024/09/13(金) 20:41:46.32 ID:cjEIJ97r0 速度の最適化か、生成されるオブジェクトの小ささかのトレードオフなんだろうね テスト用のコードは小さいから、後者は気にせずゴリゴリやってるのかな… http://mevius.5ch.net/test/read.cgi/tech/1721137434/130
131: デフォルトの名無しさん (ワッチョイ fa2d-2PHd) [sage] 2024/09/13(金) 23:38:57.27 ID:uRdGeQ4y0 世の中CやめてRustにしろだとか OpenAIの新AIが競プロで上位1割のプログラマに匹敵とか言うじゃない 今更人間がCを続ける意義ってなんなんだろう http://mevius.5ch.net/test/read.cgi/tech/1721137434/131
132: デフォルトの名無しさん (ワッチョイ 714e-/njq) [sage] 2024/09/14(土) 00:03:48.69 ID:UIMFiyQN0 COBOLみたくロストテクノロジーを理解出来る貴重な人になれる http://mevius.5ch.net/test/read.cgi/tech/1721137434/132
133: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-hr+9) [sage] 2024/09/14(土) 00:19:19.91 ID:N2YvcTj50 低レイヤに関わる資料が C を前提に書かれていたりするのは普通のことなのでたとえ C でプログラミングしなくてもある程度は身に付いてないと困ることはあるだろう。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/133
134: デフォルトの名無しさん (ワッチョイ a6e1-865n) [sage] 2024/09/14(土) 00:39:08.66 ID:0gsw2riP0 >>128 初期化する以外に参照されてないってのはおかしいだろ printfで中身が表示されてんだから ポインター変数のbar経由で中身を参照してるけど、中身は初期化で渡された文字列そのものだ そもそもリテラルが参照されてないという言い方もおかしい リテラルは単なる定数の簡略表記に過ぎず、ソースコード上だけの用語だ 実行時に消えてると言いたいのか? そんなわけない、全く消えてない http://mevius.5ch.net/test/read.cgi/tech/17211374
34/134
135: デフォルトの名無しさん (ワッチョイ 6663-QZ+t) [sage] 2024/09/14(土) 00:51:01.21 ID:8t7wdnSS0 >>132 CobolやFortranはこれからも生き残るよ 多分 http://mevius.5ch.net/test/read.cgi/tech/1721137434/135
136: デフォルトの名無しさん (ワッチョイ 2a7c-9vXG) [] 2024/09/14(土) 08:27:14.72 ID:QgTfRJpW0 >>134 言ってることが意味不明。 textセグメントとかbssとかdataセグメントとか知らんの? http://mevius.5ch.net/test/read.cgi/tech/1721137434/136
137: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-IU9Y) [sage] 2024/09/14(土) 08:59:02.76 ID:N2YvcTj50 >>134 > printfで中身が表示 意味が解らん。 表示されてる中身というのは foo の中身であってリテラルじゃないだろ。 > リテラルは単なる定数の簡略表記 整数リテラルなどは右辺値だが文字列リテラルに限っては左辺値。 文字列リテラルは実行フェイズにおいてオブジェクトとしての性質を持つということ。 (抽象機械の上では。) ただし、この文字列リテラルが型変換された結果によって生まれるポインタはアドレス定数の要件を満たす
。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/137
138: デフォルトの名無しさん (ワッチョイ a6e1-865n) [sage] 2024/09/14(土) 10:32:56.64 ID:0gsw2riP0 >>137 int i = 1; printf("i -> %d\n", i); この1は同じ様にリテラル表記以外に参照されてないというのか? http://mevius.5ch.net/test/read.cgi/tech/1721137434/138
139: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-IU9Y) [sage] 2024/09/14(土) 10:49:21.06 ID:N2YvcTj50 >>138 前述の通り整数リテラルは右辺値 (rvalue)。 文字列リテラルは例外的な存在だ。 まず、 C の用語では「オブジェクト」と「値」は違う意味を持つ。 メモリ上のビットパターンがオブジェクトで、値は式の結果だ。 (規格用語では data storage だがここではあえてカジュアルな用語で言うことにする。) そして式の結果は lvalue と rvalue に区分される。 オブジェクトに結び付いている値が lvalue だと考えていい。 個々に規定がある
ので詳細は割愛するが、 式の中で変数名だとか単項 * 演算だとか [] とかがあればそれはメモリ上に存在してるのは明白だろ? そういうのが lvalue 。 たとえば 1+3+5 みたいな式があれば途中で 4 という値が生じるが、これは「どこ」にある? 場所に結び付いておらず、式が終われば破棄されることになってる。 こういうのが rvalue 。 ちなみに lvalue も rvalue が要求される文脈では rvalue に変換される。 (メモリから値が読みだされる。) http://mevius.5ch.net/test/read.cgi/tech/1721137434/139
140: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-IU9Y) [sage] 2024/09/14(土) 12:58:36.93 ID:N2YvcTj50 >>138 このときの 1 というリテラルは (rvalue の) 1 を返す式で、その値が i にコピーされた後で寿命を終えて消滅する。 printf の引数の i で取り出される 1 は i に入っている 1 であってリテラルの 1 じゃない。 整数リテラルはあくまでも整数を返す (生成すると言ってもいいかも?) 式であって、メモリ上のどこかにあるオブジェクトというわけじゃない。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/140
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
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 850 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.017s