[過去ログ]
C言語なら俺に聞け 163 (1002レス)
C言語なら俺に聞け 163 http://mevius.5ch.net/test/read.cgi/tech/1721137434/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
118: デフォルトの名無しさん (JP 0H3e-voeu) [sage] 2024/09/13(金) 16:10:44.34 ID:HymUJJD5H gccは配列に確保した短い文字列は最適化無しでもレジスターに載せてしまってるな ポインター文字列は最適化してもレジスターには載らない なので配列は配列として使った方が最適化で高速化される可能性があるという事だな http://mevius.5ch.net/test/read.cgi/tech/1721137434/118
119: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-IU9Y) [sage] 2024/09/13(金) 16:26:39.79 ID:7dvxgxgq0 ポインター文字列って変な言葉だな。 この場の造語だと思うけど char *foo = "bar"; みたいなやつのことだよね? 文字列リテラルは静的記憶域期間 (寿命はプログラムの最初から最後まで) を持つオブジェクト。 どこかにある文字列をポインタで指しているという状況。 そのどこかにある文字は他のどこかから指し示されることもありうるので簡単には消えられない。 その一方で、配列の初期化子は配列を初期化する以外に使われる可能性
がない。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/119
120: デフォルトの名無しさん (アウアウエー Sa52-t/33) [] 2024/09/13(金) 16:36:31.22 ID:bblj+c3pa >>93 それのどこがマトモなんだよ >>94 の言い分の方が正しい 配列型が無いんだから http://mevius.5ch.net/test/read.cgi/tech/1721137434/120
121: デフォルトの名無しさん (アウアウエー Sa52-t/33) [] 2024/09/13(金) 16:38:54.03 ID:bblj+c3pa >>96 >t[100]を*(t+idx) t[100]を100[t] よりはマシ >>97 だよな http://mevius.5ch.net/test/read.cgi/tech/1721137434/121
122: デフォルトの名無しさん (JP 0H3e-voeu) [sage] 2024/09/13(金) 17:26:56.71 ID:HymUJJD5H >>119 んなこたーない char foo[] = "hoge"; char* bar = &foo[1]; /* 敢えてずらしてみる */ printf("bar -> %s\n", bar); で中身は何度も参照されるぞ gccで試してみたら敢えてずらしてポインターに代入されたとしても、レジスターに文字列を保持したままprintfに渡すというトリッキーなコードが生成されたw スタックに文字列を書き込んでそのアドレスを渡してるっぽい http://mevius.5ch.net/test/read.cgi/tech/1721
137434/122
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
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 855 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.015s