鱼C论坛

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

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

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

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

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

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


                        printf("main: 0x%X\n", main);
seg000:0299                 mov     ax, 291h
seg000:029C                 push    ax
seg000:029D                 mov     ax, 0AAh ; '
seg000:02A0                 push    ax
seg000:02A1                 call    sub_10F0A
seg000:02A4                 pop     cx
seg000:02A5                 pop     cx



                        for(i = 0; i < 10; ++i)
seg000:02A6                 xor     di, di
seg000:02A8                 jmp     short loc_102B8
seg000:02AA ; ---------------------------------------------------------------------------
seg000:02AA
seg000:02AA loc_102AA:                              ; CODE XREF: sub_10291+2Aj
seg000:02AA                 mov     bx, di
seg000:02AC                 shl     bx, 1
seg000:02AE                 lea     ax, [bp+var_14]
seg000:02B1                 add     bx, ax
seg000:02B3                 mov     word ptr [bx], 0
seg000:02B7                 inc     di
seg000:02B8
seg000:02B8 loc_102B8:                              ; CODE XREF: sub_10291+17j
seg000:02B8                 cmp     di, 0Ah
seg000:02BB                 jl      short loc_102AA


                        for(ap = a; ap < a + 10; ++ap)
seg000:02BD                 lea     ax, [bp+var_14]
seg000:02C0                 mov     si, ax
seg000:02C2                 jmp     short loc_102CB
seg000:02C4 ; ---------------------------------------------------------------------------
seg000:02C4
seg000:02C4 loc_102C4:                              ; CODE XREF: sub_10291+3Fj
seg000:02C4                 mov     word ptr [si], 0
seg000:02C8                 add     si, 2
seg000:02CB
seg000:02CB loc_102CB:                              ; CODE XREF: sub_10291+31j
seg000:02CB                 lea     ax, [bp+var_s0]
seg000:02CE                 cmp     ax, si
seg000:02D0                 ja      short loc_102C4



                        return 0;
seg000:02D2                 xor     ax, ax
seg000:02D4                 jmp     short $+2
seg000:02D6 ; ---------------------------------------------------------------------------
seg000:02D6
seg000:02D6 loc_102D6:                              ; CODE XREF: sub_10291+43j
seg000:02D6                 pop     di
seg000:02D7                 pop     si
seg000:02D8                 mov     sp, bp
seg000:02DA                 pop     bp
seg000:02DB                 retn
seg000:02DB sub_10291       endp
f2ea313e53884445ff91222209def6f.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

发表于 2018-5-10 19:37:49 From FishC Mobile | 显示全部楼层
个人感觉指针高一些
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


Disassembly of section .text:

0000000000000000 <main>:
#include <stdio.h>

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

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

        return 0;
  54:        b8 00 00 00 00               mov    $0x0,%eax
}
  59:        48 83 c4 60                  add    $0x60,%rsp
  5d:        5d                           pop    %rbp
  5e:        c3                           retq   
  5f:        90                           nop
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

感觉·····
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢你的意见,虽然我看不懂汇编语言
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


                        printf("main: 0x%X\n", main);
seg000:0299                 mov     ax, 291h
seg000:029C                 push    ax
seg000:029D                 mov     ax, 0AAh ; '
seg000:02A0                 push    ax
seg000:02A1                 call    sub_10F0A
seg000:02A4                 pop     cx
seg000:02A5                 pop     cx



                        for(i = 0; i < 10; ++i)
seg000:02A6                 xor     di, di
seg000:02A8                 jmp     short loc_102B8
seg000:02AA ; ---------------------------------------------------------------------------
seg000:02AA
seg000:02AA loc_102AA:                              ; CODE XREF: sub_10291+2Aj
seg000:02AA                 mov     bx, di
seg000:02AC                 shl     bx, 1
seg000:02AE                 lea     ax, [bp+var_14]
seg000:02B1                 add     bx, ax
seg000:02B3                 mov     word ptr [bx], 0
seg000:02B7                 inc     di
seg000:02B8
seg000:02B8 loc_102B8:                              ; CODE XREF: sub_10291+17j
seg000:02B8                 cmp     di, 0Ah
seg000:02BB                 jl      short loc_102AA


                        for(ap = a; ap < a + 10; ++ap)
seg000:02BD                 lea     ax, [bp+var_14]
seg000:02C0                 mov     si, ax
seg000:02C2                 jmp     short loc_102CB
seg000:02C4 ; ---------------------------------------------------------------------------
seg000:02C4
seg000:02C4 loc_102C4:                              ; CODE XREF: sub_10291+3Fj
seg000:02C4                 mov     word ptr [si], 0
seg000:02C8                 add     si, 2
seg000:02CB
seg000:02CB loc_102CB:                              ; CODE XREF: sub_10291+31j
seg000:02CB                 lea     ax, [bp+var_s0]
seg000:02CE                 cmp     ax, si
seg000:02D0                 ja      short loc_102C4



                        return 0;
seg000:02D2                 xor     ax, ax
seg000:02D4                 jmp     short $+2
seg000:02D6 ; ---------------------------------------------------------------------------
seg000:02D6
seg000:02D6 loc_102D6:                              ; CODE XREF: sub_10291+43j
seg000:02D6                 pop     di
seg000:02D7                 pop     si
seg000:02D8                 mov     sp, bp
seg000:02DA                 pop     bp
seg000:02DB                 retn
seg000:02DB sub_10291       endp
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

之前不是说下标效率高来着吗??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

之前的之前还说过一句话
无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

哈哈~我迟点去学汇编基础,到时候再讨论
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-29 20:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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