[過去ログ]
C言語なら俺に聞け 163 (1002レス)
C言語なら俺に聞け 163 http://mevius.5ch.net/test/read.cgi/tech/1721137434/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
100: デフォルトの名無しさん (ワッチョイ 6663-QZ+t) [sage] 2024/09/11(水) 23:11:00.81 ID:dQ20XCdF0 > while (*(t+i) = *s++) これは、 > while (*t++ = *s++) ;これがエラーになるのは何故かと言う質問から始まったからです t++がエラーで、t+iなら大丈夫が理解できれば解決だと思う ポインタの理解というのは壁にはなりますが、 乗り越えれば意外と簡単です、がんばれ! http://mevius.5ch.net/test/read.cgi/tech/1721137434/100
101: 警備員[Lv.7][新芽] (ワッチョイ f931-ztXh) [sage] 2024/09/12(木) 00:58:15.86 ID:QGeKjVfA0 >>92 ありがとうございました(sには実態がない) gcc -S test.c で .s を出力して眺めてみると、そのような感じになっていました 最適化と、AT&Tのオペランドが逆なのに慣れず読みにくかったですが "hoge" は「実体」が .data に置かれ、実行時にスタックにコピーされるのかと想像してましたが、実装がどうあれ、スタッフ上に "hoge" を置くための元を実体というのは違うと思いました 実際、"hoge" は .db でアロ
ケートされず、4字は 32ビットの数値定数とされ、スタックに即値で転記されていました(実行時に生成されていました) # とても伝わりにくいと思いますが… http://mevius.5ch.net/test/read.cgi/tech/1721137434/101
102: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-IU9Y) [sage] 2024/09/12(木) 08:54:43.60 ID:TbaO6N6i0 誰も説明してなかったことに気づいた。 E1[E2] が (*((E1)+(E2))) と等価であるというルールがある。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/102
103: デフォルトの名無しさん (ワッチョイ 8a5c-8qrK) [] 2024/09/12(木) 21:59:57.92 ID:m7IlJoP80 それいにしえからのバカ発見器なんだが2024年になってもまだ動いてるとはC言語おそるべし http://mevius.5ch.net/test/read.cgi/tech/1721137434/103
104: 警備員[Lv.3][新芽] (ワッチョイ b68a-ztXh) [sage] 2024/09/12(木) 23:41:05.77 ID:+nQe2m720 次の方どうぞ http://mevius.5ch.net/test/read.cgi/tech/1721137434/104
105: デフォルトの名無しさん (ワッチョイ a6ee-865n) [sage] 2024/09/12(木) 23:43:09.62 ID:sEtsUeoh0 >>103 その自由度があるからC++でhtbl["key"]の様な事が出来る Cじゃ意味ない仕様だけど、禁止する必要も無かろう http://mevius.5ch.net/test/read.cgi/tech/1721137434/105
106: デフォルトの名無しさん (ワッチョイ 65cd-RtM0) [sage] 2024/09/13(金) 08:23:17.89 ID:ykZRrldI0 >>101 "hoge"は長さちょうど32ビットだから即値でスタックに書き込むようになってるということなら 最適化によってそこまで省略されてるわけでsに実体がない件とはあまり関係ないな 最適化オフにするかもっと長い文字列で実験してみては http://mevius.5ch.net/test/read.cgi/tech/1721137434/106
107: 警備員[Lv.5][新芽] (ワッチョイ 1eeb-ztXh) [sage] 2024/09/13(金) 09:12:47.27 ID:cjEIJ97r0 >>106 ありがとうございます もう少し正確に書けばよかったのですが、4字と '\0' の2回に分けて転記していました また、hogeを長くして(10字くらい?)試すと、やはり 4字ずつ整数にパックして即値で転記していました もっと長大な文字列試せば、別にアロケートされたそれをコピーするコードが吐かれたかもしれませんが、>>92 の指摘通り、実体がなく実行時に生成されることを確認できたとして打ち切ってしまいました http://mevius.5ch.n
et/test/read.cgi/tech/1721137434/107
108: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 65e8-hr+9) [sage] 2024/09/13(金) 10:12:57.71 ID:9XTDQHQm0 C の仕様は抽象機械の動作として記述される。 抽象機械の動作をどのように実際の機械と対応させるかは自由で、見かけ上の動作が同じならどういう機械語になってもいい。 生成された機械語から言語仕様を理解しようとすべきではないよ。 低レイヤプログラミングするならどう対応付くか知る必要がある場合もあるのは否定しないけど…… http://mevius.5ch.net/test/read.cgi/tech/1721137434/108
109: デフォルトの名無しさん (ブーイモ MM45-bJfQ) [sage] 2024/09/13(金) 10:23:10.52 ID:OBSQyTYbM その抽象機械の定義はしょせん後付け c言語のソースから生成されるマシン語の想像が付くようになるのはいいこと http://mevius.5ch.net/test/read.cgi/tech/1721137434/109
110: デフォルトの名無しさん (ワッチョイ 6663-QZ+t) [sage] 2024/09/13(金) 10:25:26.12 ID:y2ap91b60 C言語ハンドコンパイラ http://mevius.5ch.net/test/read.cgi/tech/1721137434/110
111: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 65e8-hr+9) [sage] 2024/09/13(金) 11:25:36.89 ID:9XTDQHQm0 >>109 機械語の想像がつくのが不要とも悪いとも言ってないよ。 そこから言語仕様を理解しようとすべきじゃないと述べてる。 できないから。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/111
112: デフォルトの名無しさん (ワッチョイ a510-IFMZ) [sage] 2024/09/13(金) 11:46:29.60 ID:HT/On1VB0 所詮部外者の推測。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/112
113: デフォルトの名無しさん (ワンミングク MM7a-k+ON) [sage] 2024/09/13(金) 12:46:10.11 ID:CiewPVvpM 今日は患者が多いですね http://mevius.5ch.net/test/read.cgi/tech/1721137434/113
114: デフォルトの名無しさん (ブーイモ MM45-bJfQ) [sage] 2024/09/13(金) 12:53:56.59 ID:OBSQyTYbM >>111 無用な心配 Xに溢れてるクソリプと同じ http://mevius.5ch.net/test/read.cgi/tech/1721137434/114
115: 警備員[Lv.1][新芽] (ワッチョイ 1e86-ztXh) [sage] 2024/09/13(金) 13:50:08.30 ID:cjEIJ97r0 >>108 ありがとうございます そもそも >>88 で sの実体がないとはどういうことか、というのが疑問だったためで、言語の仕様(というか実装)がどうかには着目していませんでした printf("%s\n", s); が .sではputs(s); に置き換えられていたり そうだよな〜 http://mevius.5ch.net/test/read.cgi/tech/1721137434/115
116: 警備員[Lv.1][新芽] (ワッチョイ 1e49-ztXh) [sage] 2024/09/13(金) 13:59:45.58 ID:cjEIJ97r0 あー、実装には注目してるのか>自分 http://mevius.5ch.net/test/read.cgi/tech/1721137434/116
117: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-hr+9) [sage] 2024/09/13(金) 14:32:38.41 ID:7dvxgxgq0 この場合に限っては言語仕様としての理屈もあんまり違わんけどな。 ただ、正式な用語を知ってると細かいことを調べやすいみたいなのはあるので便利。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/117
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
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 873 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.023s