[過去ログ] Qiita 3 - キータぞ、来たぞ、キータだぞー (1002レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
261: デフォルトの名無しさん [sage] 2023/08/10(木) 19:42:46.48 ID:c2H9n5TK(1/9) AAS
> しかし多くのケースではコンパイラのコード生成に任せることができる
> 今回のケースならばif文のままでも条件ムーブ(CMOVcc)命令などが生成され条件分岐とならないだろう
> ソースコードの可読性からもif文のままが好ましい

なにやら知ったようなことを言ってるので検証してみるとするか。
262: デフォルトの名無しさん [sage] 2023/08/10(木) 19:43:13.35 ID:c2H9n5TK(2/9) AAS
void hoge(int n, int num[n], int deleteNum)
{
 for (int i = 0; i < n; i++) {
  if (num[i] == deleteNum) { //deleteNumで指定した要素を0にする
   num[i] = 0;
  }
 }
}

gcc 13.2 最適化オプション-O2でコンパイル
hoge:
    testl  %edi, %edi
    jle   .L1
    movslq %edi, %rdi
    leaq  (%rsi,%rdi,4), %rax
.L4:
    cmpl  %edx, (%rsi)
    jne   .L3
    movl  $0, (%rsi)
.L3:
    addq  $4, %rsi
    cmpq  %rax, %rsi
    jne   .L4
.L1:
    ret
外部リンク:godbolt.org

条件分岐するじゃんw
263
(2): デフォルトの名無しさん [sage] 2023/08/10(木) 19:46:00.32 ID:c2H9n5TK(3/9) AAS
記事の計算による方法
void hoge(int n, int num[n], int deleteNum)
{
 for (int i = 0; i < n; i++) {
  for (int i = 0; i < 6; i++) {
   num[i] -= deleteNum * (deleteNum == num[i]); // deleteNumで指定した要素を消す
  }
 }
}
hoge: xorl  %r11d, %r11d
    leaq  24(%rsi), %r10
    xorl  %r9d, %r9d
    testl  %edi, %edi
    jle   .L9
.L2:  movq  %rsi, %rax
.L4:  movl  (%rax), %ecx
    movl  %r9d, %r8d
    cmpl  %edx, %ecx
    cmove  %edx, %r8d
    addq  $4, %rax
    subl  %r8d, %ecx
    movl  %ecx, -4(%rax)
    cmpq  %r10, %rax
    jne   .L4
    addl  $1, %r11d
    cmpl  %r11d, %edi
    jne   .L2
    ret
.L9:  ret
外部リンク:godbolt.org

cmov命令吐いてる
264
(2): デフォルトの名無しさん [] 2023/08/10(木) 19:47:40.53 ID:c2H9n5TK(4/9) AAS
ちなみに計算による方法でもこう書くと2行短くなった

void hoge(int n, int num[n], int deleteNum)
{
 for (int i = 0; i < n; i++) {
  for (int i = 0; i < 6; i++) {
   num[i] *= deleteNum != num[i]; // deleteNumで指定した要素を消す
  }
 }
}
hoge: xorl  %r10d, %r10d
    leaq  24(%rsi), %r9
    xorl  %r8d, %r8d
    testl  %edi, %edi
    jle   .L9
.L2:  movq  %rsi, %rax
.L4:  movl  (%rax), %ecx
    cmpl  %edx, %ecx
    cmove  %r8d, %ecx
    addq  $4, %rax
    movl  %ecx, -4(%rax)
    cmpq  %r9, %rax
    jne   .L4
    addl  $1, %r10d
    cmpl  %r10d, %edi
    jne   .L2
    ret
.L9:  ret
外部リンク:godbolt.org
266: デフォルトの名無しさん [sage] 2023/08/10(木) 19:57:21.15 ID:c2H9n5TK(5/9) AAS
> したがって>>253
253(4): デフォルトの名無しさん [sage] 2023/08/08(火) 19:36:07.20 ID:bRo0TWoK(1/2) AAS
C言語における「bool型へのキャスト」が無限の(悪用)可能性を秘めている理由
外部リンク:webcache.googleusercontent.com

程度低い記事だなあ、これはツッコまれるの不可避だわと思っていたら消えていた。
の記事は全面的に正しい

boolへのキャストなんてしねーよ馬鹿か
268: デフォルトの名無しさん [sage] 2023/08/10(木) 20:21:25.47 ID:c2H9n5TK(6/9) AAS
>>263訂正
void hoge(int n, int num[n], int deleteNum)
{
 for (int i = 0; i < 6; i++) {
  num[i] -= deleteNum * (deleteNum == num[i]); // deleteNumで指定した要素を消す
 }
}
hoge:
    leaq  24(%rsi), %r8
    xorl  %edi, %edi
.L2:
    movl  (%rsi), %eax
    movl  %edi, %ecx
    cmpl  %edx, %eax
    cmove  %edx, %ecx
    addq  $4, %rsi
    subl  %ecx, %eax
    movl  %eax, -4(%rsi)
    cmpq  %rsi, %r8
    jne   .L2
    ret
外部リンク:godbolt.org
269: デフォルトの名無しさん [sage] 2023/08/10(木) 20:22:14.91 ID:c2H9n5TK(7/9) AAS
>>264も訂正
void hoge(int n, int num[n], int deleteNum)
{
 for (int i = 0; i < 6; i++) {
  num[i] *= deleteNum != num[i]; // deleteNumで指定した要素を消す
 }
}

hoge:
    leaq  24(%rsi), %rdi
    xorl  %ecx, %ecx
.L2:
    movl  (%rsi), %eax
    cmpl  %edx, %eax
    cmove  %ecx, %eax
    addq  $4, %rsi
    movl  %eax, -4(%rsi)
    cmpq  %rdi, %rsi
    jne   .L2
    ret
外部リンク:godbolt.org
270: デフォルトの名無しさん [sage] 2023/08/10(木) 20:25:05.76 ID:c2H9n5TK(8/9) AAS
すまん>>263再度訂正
void hoge(int n, int num[n], int deleteNum)
{
 for (int i = 0; i < n; i++) {
  num[i] -= deleteNum * (deleteNum == num[i]); // deleteNumで指定した要素を消す
 }
}
hoge:
    testl  %edi, %edi
    jle   .L1
    movslq %edi, %rdi
    leaq  (%rsi,%rdi,4), %r8
    xorl  %edi, %edi
.L3:
    movl  (%rsi), %eax
    movl  %edi, %ecx
    cmpl  %edx, %eax
    cmove  %edx, %ecx
    addq  $4, %rsi
    subl  %ecx, %eax
    movl  %eax, -4(%rsi)
    cmpq  %rsi, %r8
    jne   .L3
.L1:
    ret
外部リンク:godbolt.org
271: デフォルトの名無しさん [sage] 2023/08/10(木) 20:25:56.38 ID:c2H9n5TK(9/9) AAS
>>264も再度訂正
void hoge(int n, int num[n], int deleteNum)
{
 for (int i = 0; i < n; i++) {
  num[i] *= deleteNum != num[i]; // deleteNumで指定した要素を消す
 }
}
hoge:
    testl  %edi, %edi
    jle   .L1
    movslq %edi, %rdi
    xorl  %ecx, %ecx
    leaq  (%rsi,%rdi,4), %rdi
.L3:
    movl  (%rsi), %eax
    cmpl  %edx, %eax
    cmove  %ecx, %eax
    addq  $4, %rsi
    movl  %eax, -4(%rsi)
    cmpq  %rsi, %rdi
    jne   .L3
.L1:
    ret
外部リンク:godbolt.org
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.032s