鱼C论坛

 找回密码
 立即注册
查看: 3409|回复: 10

[已解决]数组下标和指针的效率问题

[复制链接]
发表于 2018-5-10 18:55:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
看过《C和指针》的鱼油能不能解释一下使用数组指针和直接使用下标的效率哪个高?书里说是指针高,百度不少答案说下标效率高。
最佳答案
2018-5-10 23:37:54
tc3.0 指针效率高
数组下标 用了10条指令
指针用了8条指令
  1. seg000:0291 sub_10291       proc near               ; CODE XREF: start+155p
  2. seg000:0291
  3. seg000:0291 var_14          = byte ptr -14h
  4. seg000:0291 var_s0          = byte ptr  0
  5. seg000:0291
  6. seg000:0291                 push    bp
  7. seg000:0292                 mov     bp, sp
  8. seg000:0294                 sub     sp, 14h
  9. seg000:0297                 push    si
  10. seg000:0298                 push    di


  11.                         printf("main: 0x%X\n", main);
  12. seg000:0299                 mov     ax, 291h
  13. seg000:029C                 push    ax
  14. seg000:029D                 mov     ax, 0AAh ; '
  15. seg000:02A0                 push    ax
  16. seg000:02A1                 call    sub_10F0A
  17. seg000:02A4                 pop     cx
  18. seg000:02A5                 pop     cx



  19.                         for(i = 0; i < 10; ++i)
  20. seg000:02A6                 xor     di, di
  21. seg000:02A8                 jmp     short loc_102B8
  22. seg000:02AA ; ---------------------------------------------------------------------------
  23. seg000:02AA
  24. seg000:02AA loc_102AA:                              ; CODE XREF: sub_10291+2Aj
  25. seg000:02AA                 mov     bx, di
  26. seg000:02AC                 shl     bx, 1
  27. seg000:02AE                 lea     ax, [bp+var_14]
  28. seg000:02B1                 add     bx, ax
  29. seg000:02B3                 mov     word ptr [bx], 0
  30. seg000:02B7                 inc     di
  31. seg000:02B8
  32. seg000:02B8 loc_102B8:                              ; CODE XREF: sub_10291+17j
  33. seg000:02B8                 cmp     di, 0Ah
  34. seg000:02BB                 jl      short loc_102AA


  35.                         for(ap = a; ap < a + 10; ++ap)
  36. seg000:02BD                 lea     ax, [bp+var_14]
  37. seg000:02C0                 mov     si, ax
  38. seg000:02C2                 jmp     short loc_102CB
  39. seg000:02C4 ; ---------------------------------------------------------------------------
  40. seg000:02C4
  41. seg000:02C4 loc_102C4:                              ; CODE XREF: sub_10291+3Fj
  42. seg000:02C4                 mov     word ptr [si], 0
  43. seg000:02C8                 add     si, 2
  44. seg000:02CB
  45. seg000:02CB loc_102CB:                              ; CODE XREF: sub_10291+31j
  46. seg000:02CB                 lea     ax, [bp+var_s0]
  47. seg000:02CE                 cmp     ax, si
  48. seg000:02D0                 ja      short loc_102C4



  49.                         return 0;
  50. seg000:02D2                 xor     ax, ax
  51. seg000:02D4                 jmp     short $+2
  52. seg000:02D6 ; ---------------------------------------------------------------------------
  53. seg000:02D6
  54. seg000:02D6 loc_102D6:                              ; CODE XREF: sub_10291+43j
  55. seg000:02D6                 pop     di
  56. seg000:02D7                 pop     si
  57. seg000:02D8                 mov     sp, bp
  58. seg000:02DA                 pop     bp
  59. seg000:02DB                 retn
  60. seg000:02DB sub_10291       endp
复制代码
f2ea313e53884445ff91222209def6f.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-5-10 19:05:19 | 显示全部楼层
这个问题没有标准答案,不同的编译器很可能会有不同的结果
全看编译器如何做
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-10 19:37:49 From FishC Mobile | 显示全部楼层
个人感觉指针高一些
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-10 19:38:14 | 显示全部楼层
在我的系统上是数组下标效率高
数组下标 用了9条指令
指针用了10条指令


  1. main.o:     file format pe-x86-64


  2. Disassembly of section .text:

  3. 0000000000000000 <main>:
  4. &#65279;#include <stdio.h>

  5. int main(void)
  6. {
  7.    0:        55                           push   %rbp
  8.    1:        48 89 e5                     mov    %rsp,%rbp
  9.    4:        48 83 ec 60                  sub    $0x60,%rsp
  10.    8:        e8 00 00 00 00               callq  d <main+0xd>
  11.         int a[10];

  12.         for(int i = 0; i < 10; ++i)
  13.    d:        c7 45 fc 00 00 00 00         movl   $0x0,-0x4(%rbp)
  14.   14:        eb 11                        jmp    27 <main+0x27>
  15.         {
  16.                 a[i] = 0;
  17.   16:        8b 45 fc                     mov    -0x4(%rbp),%eax
  18.   19:        48 98                        cltq   
  19.   1b:        c7 44 85 c0 00 00 00         movl   $0x0,-0x40(%rbp,%rax,4)
  20.   22:        00
  21.         for(int i = 0; i < 10; ++i)
  22.   23:        83 45 fc 01                  addl   $0x1,-0x4(%rbp)
  23.   27:        83 7d fc 09                  cmpl   $0x9,-0x4(%rbp)
  24.   2b:        7e e9                        jle    16 <main+0x16>
  25.         }
  26.         for(int *ap = a; ap < a + 10; ++ap)
  27.   2d:        48 8d 45 c0                  lea    -0x40(%rbp),%rax
  28.   31:        48 89 45 f0                  mov    %rax,-0x10(%rbp)
  29.   35:        eb 0f                        jmp    46 <main+0x46>
  30.         {
  31.                 *ap = 0;
  32.   37:        48 8b 45 f0                  mov    -0x10(%rbp),%rax
  33.   3b:        c7 00 00 00 00 00            movl   $0x0,(%rax)
  34.         for(int *ap = a; ap < a + 10; ++ap)
  35.   41:        48 83 45 f0 04               addq   $0x4,-0x10(%rbp)
  36.   46:        48 8d 45 c0                  lea    -0x40(%rbp),%rax
  37.   4a:        48 83 c0 28                  add    $0x28,%rax
  38.   4e:        48 3b 45 f0                  cmp    -0x10(%rbp),%rax
  39.   52:        77 e3                        ja     37 <main+0x37>
  40.         }

  41.         return 0;
  42.   54:        b8 00 00 00 00               mov    $0x0,%eax
  43. }
  44.   59:        48 83 c4 60                  add    $0x60,%rsp
  45.   5d:        5d                           pop    %rbp
  46.   5e:        c3                           retq   
  47.   5f:        90                           nop
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-10 23:03:57 | 显示全部楼层
BngThea 发表于 2018-5-10 19:37
个人感觉指针高一些

感觉·····
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-10 23:05:01 | 显示全部楼层
人造人 发表于 2018-5-10 19:38
在我的系统上是数组下标效率高
数组下标 用了9条指令
指针用了10条指令

谢谢你的意见,虽然我看不懂汇编语言
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-10 23:37:54 | 显示全部楼层    本楼为最佳答案   
tc3.0 指针效率高
数组下标 用了10条指令
指针用了8条指令
  1. seg000:0291 sub_10291       proc near               ; CODE XREF: start+155p
  2. seg000:0291
  3. seg000:0291 var_14          = byte ptr -14h
  4. seg000:0291 var_s0          = byte ptr  0
  5. seg000:0291
  6. seg000:0291                 push    bp
  7. seg000:0292                 mov     bp, sp
  8. seg000:0294                 sub     sp, 14h
  9. seg000:0297                 push    si
  10. seg000:0298                 push    di


  11.                         printf("main: 0x%X\n", main);
  12. seg000:0299                 mov     ax, 291h
  13. seg000:029C                 push    ax
  14. seg000:029D                 mov     ax, 0AAh ; '
  15. seg000:02A0                 push    ax
  16. seg000:02A1                 call    sub_10F0A
  17. seg000:02A4                 pop     cx
  18. seg000:02A5                 pop     cx



  19.                         for(i = 0; i < 10; ++i)
  20. seg000:02A6                 xor     di, di
  21. seg000:02A8                 jmp     short loc_102B8
  22. seg000:02AA ; ---------------------------------------------------------------------------
  23. seg000:02AA
  24. seg000:02AA loc_102AA:                              ; CODE XREF: sub_10291+2Aj
  25. seg000:02AA                 mov     bx, di
  26. seg000:02AC                 shl     bx, 1
  27. seg000:02AE                 lea     ax, [bp+var_14]
  28. seg000:02B1                 add     bx, ax
  29. seg000:02B3                 mov     word ptr [bx], 0
  30. seg000:02B7                 inc     di
  31. seg000:02B8
  32. seg000:02B8 loc_102B8:                              ; CODE XREF: sub_10291+17j
  33. seg000:02B8                 cmp     di, 0Ah
  34. seg000:02BB                 jl      short loc_102AA


  35.                         for(ap = a; ap < a + 10; ++ap)
  36. seg000:02BD                 lea     ax, [bp+var_14]
  37. seg000:02C0                 mov     si, ax
  38. seg000:02C2                 jmp     short loc_102CB
  39. seg000:02C4 ; ---------------------------------------------------------------------------
  40. seg000:02C4
  41. seg000:02C4 loc_102C4:                              ; CODE XREF: sub_10291+3Fj
  42. seg000:02C4                 mov     word ptr [si], 0
  43. seg000:02C8                 add     si, 2
  44. seg000:02CB
  45. seg000:02CB loc_102CB:                              ; CODE XREF: sub_10291+31j
  46. seg000:02CB                 lea     ax, [bp+var_s0]
  47. seg000:02CE                 cmp     ax, si
  48. seg000:02D0                 ja      short loc_102C4



  49.                         return 0;
  50. seg000:02D2                 xor     ax, ax
  51. seg000:02D4                 jmp     short $+2
  52. seg000:02D6 ; ---------------------------------------------------------------------------
  53. seg000:02D6
  54. seg000:02D6 loc_102D6:                              ; CODE XREF: sub_10291+43j
  55. seg000:02D6                 pop     di
  56. seg000:02D7                 pop     si
  57. seg000:02D8                 mov     sp, bp
  58. seg000:02DA                 pop     bp
  59. seg000:02DB                 retn
  60. seg000:02DB sub_10291       endp
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-11 12:52:10 | 显示全部楼层
人造人 发表于 2018-5-10 23:37
tc3.0 指针效率高
数组下标 用了10条指令
指针用了8条指令

之前不是说下标效率高来着吗??
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-11 12:57:11 | 显示全部楼层
程序员的救赎 发表于 2018-5-11 12:52
之前不是说下标效率高来着吗??

之前的之前还说过一句话
无标题.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-11 23:30:07 | 显示全部楼层
人造人 发表于 2018-5-11 12:57
之前的之前还说过一句话

哈哈~我迟点去学汇编基础,到时候再讨论
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-12 00:00:41 | 显示全部楼层
程序员的救赎 发表于 2018-5-11 23:30
哈哈~我迟点去学汇编基础,到时候再讨论

^_^
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-9 09:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表