程序员的救赎 发表于 2018-5-10 18:55:07

数组下标和指针的效率问题

看过《C和指针》的鱼油能不能解释一下使用数组指针和直接使用下标的效率哪个高?书里说是指针高,百度不少答案说下标效率高。

人造人 发表于 2018-5-10 19:05:19

这个问题没有标准答案,不同的编译器很可能会有不同的结果
全看编译器如何做

BngThea 发表于 2018-5-10 19:37:49

个人感觉指针高一些

人造人 发表于 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               callqd <main+0xd>
        int a;

        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 = 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

程序员的救赎 发表于 2018-5-10 23:03:57

BngThea 发表于 2018-5-10 19:37
个人感觉指针高一些

感觉·····

程序员的救赎 发表于 2018-5-10 23:05:01

人造人 发表于 2018-5-10 19:38
在我的系统上是数组下标效率高
数组下标 用了9条指令
指针用了10条指令

{:10_266:}谢谢你的意见,虽然我看不懂汇编语言

人造人 发表于 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 ptr0
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,
seg000:02B1               add   bx, ax
seg000:02B3               mov   word ptr , 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,
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 , 0
seg000:02C8               add   si, 2
seg000:02CB
seg000:02CB loc_102CB:                              ; CODE XREF: sub_10291+31j
seg000:02CB               lea   ax,
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

程序员的救赎 发表于 2018-5-11 12:52:10

人造人 发表于 2018-5-10 23:37
tc3.0 指针效率高
数组下标 用了10条指令
指针用了8条指令

之前不是说下标效率高来着吗??

人造人 发表于 2018-5-11 12:57:11

程序员的救赎 发表于 2018-5-11 12:52
之前不是说下标效率高来着吗??

之前的之前还说过一句话

程序员的救赎 发表于 2018-5-11 23:30:07

人造人 发表于 2018-5-11 12:57
之前的之前还说过一句话

哈哈~我迟点去学汇编基础,到时候再讨论

人造人 发表于 2018-5-12 00:00:41

程序员的救赎 发表于 2018-5-11 23:30
哈哈~我迟点去学汇编基础,到时候再讨论

^_^
页: [1]
查看完整版本: 数组下标和指针的效率问题