C言語なら俺に聞け 163 (841レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
118(1): デフォルトの名無しさん (JP 0H3e-voeu) [sage] 2024/09/13(金) 16:10:44.34 ID:HymUJJD5H(1/5) AAS
gccは配列に確保した短い文字列は最適化無しでもレジスターに載せてしまってるな
ポインター文字列は最適化してもレジスターには載らない
なので配列は配列として使った方が最適化で高速化される可能性があるという事だな
122(2): デフォルトの名無しさん (JP 0H3e-voeu) [sage] 2024/09/13(金) 17:26:56.71 ID:HymUJJD5H(2/5) AAS
>>119119(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 7932-IU9Y) [sage] 2024/09/13(金) 16:26:39.79 ID:7dvxgxgq0(2/3) AAS
ポインター文字列って変な言葉だな。
この場の造語だと思うけど
char *foo = "bar";
みたいなやつのことだよね?
文字列リテラルは静的記憶域期間 (寿命はプログラムの最初から最後まで) を持つオブジェクト。
どこかにある文字列をポインタで指しているという状況。
そのどこかにある文字は他のどこかから指し示されることもありうるので簡単には消えられない。
その一方で、配列の初期化子は配列を初期化する以外に使われる可能性がない。
んなこたーない
char foo[] = "hoge";
char* bar = &foo[1]; /* 敢えてずらしてみる */
printf("bar -> %s\n", bar);
で中身は何度も参照されるぞ
gccで試してみたら敢えてずらしてポインターに代入されたとしても、レジスターに文字列を保持したままprintfに渡すというトリッキーなコードが生成されたw
スタックに文字列を書き込んでそのアドレスを渡してるっぽい
123: デフォルトの名無しさん (JP 0H3e-voeu) [sage] 2024/09/13(金) 17:45:50.36 ID:HymUJJD5H(3/5) AAS
短い配列文字列をポインターに代入したらレジスターに保持する最適化を諦めるかと思ったら、そうじゃなくて意地でもレジスターに保持したまま処理を進めるgccスゲーよw
clangの場合はポインターも配列も常に静的に文字列を定義したものを使ってた
125: デフォルトの名無しさん (JP 0H3e-voeu) [sage] 2024/09/13(金) 18:26:19.17 ID:HymUJJD5H(4/5) AAS
gccの場合だと64bitだと8バイトだから最大7文字かなと思ったらレジスターを複数使ってでも載せようとしてたw
取り敢えず50文字まで試したけど全部レジスタに載ってた
でもこの辺はレジスタの空き具合にもよるのか?詳しくは分からん
127(2): デフォルトの名無しさん (JP 0H3e-voeu) [sage] 2024/09/13(金) 18:50:06.89 ID:HymUJJD5H(5/5) AAS
スマン…間違えた…orz
正確にはアセンブリコードに書かれてると言うべきだった
movabsq $3833745473465760056, %rdx
movabsq $3978425819141910832, %rax
movq %rdx, 40(%rsp)
movabsq $3544395820347831604, %rdx
movq %rdx, 56(%rsp)
↑こんな感じで文字列が直値で表現されてて、スタックに積んで使ってた
だったら静的に確保した方が速い気がするけど、やっぱりレジスターから直接使う事が有るのか?
取り敢えずコンパイラーが出力するコードに深入りしない方が良いって事は分かったw
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 1.292s*