1. 程式人生 > >比較陣列下標操作與指標操作的速度(將程式轉換成彙編程式)

比較陣列下標操作與指標操作的速度(將程式轉換成彙編程式)

看了kaikai比較兩者關係的帖子 , 我用檔案轉換方式查看了下編輯器是如果編譯程式的 , 結果的確指標
比陣列要快 。

將以下程式轉換成彙編檔案比較迴圈操作 , 發現指標的週期比陣列少 , 所以指標速度更快
main ( )
{
 int Array[10] ;
 int *p;
 int i;

 for ( i = 0; i < 10;i++ )
      Array[i] = 1;
 for ( p = Array; p < Array + 10 ;p++ )
      *p = 2;
}

 ifndef ??version
?debug macro
 endm
 endif
 ?debug S "mmm.c"
_TEXT segment byte public 'CODE'
DGROUP group _DATA,_BSS
 assume cs:_TEXT,ds:DGROUP,ss:DGROUP
_TEXT ends
_DATA segment word public 'DATA'

[email protected] label byte
[email protected] label word
_DATA ends
_BSS segment word public 'BSS'
[email protected] label byte
[email protected] label word
 ?debug C E9565D9131056D6D6D2E63
_BSS ends
_TEXT segment byte public 'CODE'
; ?debug L 1
_main proc near
 push bp
 mov bp,sp
 sub sp,20
 push si
 push di
; ?debug L 7

;------------------------------------------------------------
;陣列賦值的過程
 xor di,di   ;計數器清0
 jmp short @5
@4:
; ?debug L 8
 mov bx,di   ;將計數器賦給bx
 shl bx,1   ;偏移地址移動兩位
 lea ax,word ptr [bp-20]     ;取得陣列偏移地址
 add bx,ax                   ;得到具體地址
 mov word ptr [bx],1         ;賦值
@3:
 inc di   ;計數器加1
@5:
 cmp di,10   ;判斷是否小於10
 jl @4
;--------------------------------------------------------------

@2:
; ?debug L 9


;--------------------------------------------------------------
;指標賦值過程
 lea si,word ptr [bp-20] ;取得陣列偏移地址
 jmp short @9

@8:
; ?debug L 10
 mov word ptr [si],2  ;給指標賦值  
@7:
 inc si
 inc si
@9:     ;判斷是否小於陣列最後地址
 lea ax,word ptr [bp]
 cmp ax,si
 ja @8
;--------------------------------------------------------------

@6:
@1:
; ?debug L 11
 pop di
 pop si
 mov sp,bp
 pop bp
 ret 
_main endp
_TEXT ends
 ?debug C E9
_DATA segment word public 'DATA'
[email protected] label byte
_DATA ends
_TEXT segment byte public 'CODE'
_TEXT ends
 public _main
 end

相關推薦

比較陣列操作指標操作速度(程式轉換彙編程式)

看了kaikai比較兩者關係的帖子 , 我用檔案轉換方式查看了下編輯器是如果編譯程式的 , 結果的確指標比陣列要快 。 將以下程式轉換成彙編檔案比較迴圈操作 , 發現指標的週期比陣列少 , 所以指標速度更快main ( ){ int Array[10] ; int *p; i

c語言二維陣列運算指標偏移

首先,定義一個二維陣列int Array[y][x];     一、 對於二維陣列的指標偏移的運演算法則。同一維陣列一樣,二維陣列的陣列名也是指向第一個陣列元素的(即Array等於&Array[0][0]),且二維陣列的陣列元素在計算機內的記憶體存放也是連續的,

[leetcode] 80 Remove Duplicates from Sorted Array II(陣列操作)

因為這道題目的題意是要求我們在原陣列上進行操作,所以操作變得稍微複雜了些,否則直接使用map最為簡單。 基本思想是記錄兩個指標,一個是當前陣列,另一個是目的陣列,注意如果發現重複數超過2,那麼目的陣列的cur就要阻塞, 直到不同的出現後再賦值前進。 class Soluti

C語言指標——對普通變數的指標操作和對陣列(常量)的指標操作

       我們知道,每一個變數都有一個記憶體位置,每一個記憶體位置都定義了可使用連字號(&)運算子訪問的地址,它表示了在記憶體中的一個地址。        我們喜歡在程式中使用指標代替陣列,因為變數指標可

linux常用命令常用操作用法及解釋(初學者必備)

1、環境變數      (1)列印環境變數:ehco  $PATH      (2)新增到環境變數(一般放在當前使用者的宿主目錄~/下的.bashrc檔案裡):export PATH=/usr/local/bin:$PATH                 解釋:每一次

C專家程式設計 十 規則2: C語言把陣列作為指標的偏移量(二)

        把陣列下標作為指標加偏移量足C語言從BCPL (C語言的祖先)繼承過來的技巧。在人們的常規思維中,在執行時增加對C語言下標的範圍檢查是不切實際的。因為取下標操作只是表示將要訪問該陣列,

回鍋DS-3:基本操作指標體驗

(本系列出自一位在工作後“回鍋資料結構”且堅持寫學習反思的網友。他用郵件發給我,徵得他的同意,我在我的部落格中當“原創”連載發出來。和我的關聯是,他的學習路線中,的確有我提供的方法的影子。) 賀老師,現在在看您的資料結構教程視訊,系統的學習資料結構。 1.知識遷移的能力鍛鍊好,這

C++之過載陣列[]圓括號()運算子的方法

#include <iostream> using namespace std; class Matrix { public: Matrix(int, int) ; int& operator()(int, int) ; // 過載圓括號運算子"()" private:

陣列越界記憶體溢位

很相似的兩個概念,一不小心就會混淆 首先,對兩個名詞做一個大概的解釋: 下標越界 在引用陣列元素時,使用的下標超過了該陣列下標的應有範圍,但應注意的是: C/C++不對陣列做邊界檢查。 可以重寫陣列的每一端,並寫入一些其他變數的陣列或者甚至是寫入程式的

array_map 等php回撥函式使用問題(關聯陣列獲取)

前言:我自己用此類回撥函式,來替代 foreach 純粹是用為程式碼的簡潔性,讓程式碼更好看。(我有點程式碼小潔癖~) 1、array_reduce 當迭代處理一個一維索引陣列時,在回撥函式內是無法獲取到當時元素索引的。所以想要獲取時,需得藉助一個外部變數。 目的:把 $arr 遍歷到 <sele

陣列的由來和為什麼陣列從0開始?

本文索引: 1.陣列的由來: a.字面引申: b.通俗解釋: 陣列的特點: 2.陣列下標為什麼從0開始: a.初步理解: b.加深理解: 1.陣列的由來: // 變數

selenium的鍵盤操作滑鼠操作

在 WebDriver 中, 將這些關於滑鼠操作的方法封裝在 ActionChains 類提供。 ActionChains 類提供了滑鼠操作的常用方法: perform(): 執行所有 ActionChains 中儲存的行為; context_click(): 右擊;

陣列為什麼是從0開始的,而不是1?

依稀記得大一開始學習C語言的時候,對於陣列下標從0開始這一點是非常彆扭難以適應的,感覺這就是反人類的設計。直到今天才瞭解這背後為什麼這樣設計的原理。 為了解釋清楚這個原因,我們來認識陣列的相關特性,據此來探索它底層的一些東西。 隨機訪問 為什麼陣列能支援隨機訪問呢,我們先來看看陣列專業定義。陣列( Arr

mysql筆記一之庫操作操作

資料庫使用者名稱: root 密碼:            mysql char(5) 長度固定為5的字串 ab  --> "ab   " varchar(5) abc --> "abc" 不能夠超

MySQL 庫操作 操作

一 庫操作 1.建立資料庫 create database db_name[資料庫選項]; 2.檢視當前存在的資料庫:show databases; (注:除使用者外,MySQL內部維護自己的資料庫) 3.檢視資料庫的建立語句 show create database

python迴圈陣列

http://outofmemory.cn/code-snippet/3741/accessing-the-index-in-python-for-loops 但是有時候我們會需要在便利陣列的同時訪問下標,這時候可以藉助於enumerate函式來實現,例如: l = [1,2,3]for

(C++)用陣列形式對一維陣列進行排序

用另一個數組下標的形式記錄一個一維陣列中下標所對應的元素出現在個數,並對此一維陣列進行排序。 例如:一個一維陣列中的元素為:a[4] = { 2,3,2,5 };此陣列為一個長度為4的陣列,另一個空陣列x[6]={ 0 };x[0] = 0,因為使用下標的形式記錄a陣列中的元素,此時x[]的

陣列越界的避免方法

為什麼會出現陣列下標越界? C語言不檢查陣列下標的合法性 陣列下標越界的危害 陣列下標越界時,結果隨機。可能導致程式功能不正常,也可能導致程式崩潰。 如何防止陣列下標越界? 1、在使用迴圈遍歷陣列元素時,注意防範off-by-one的錯誤。 2、對於作為函式引數傳入的陣列下標

(pyhon)給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列

方法一:使用最容易理解的遍歷陣列進行查詢 def solution(nums,target): #如果列表長度小於2,則直接結束 if len(nums) < 2: return #兩次迴圈列表,分別對列表中的所有可能的數字進行相加

[work] shell中陣列訪問

shell中陣列的下標預設是從0開始的 1。將字串放在陣列中,獲取其長度 #!/bin/bash str="a b --n d" array=($str) length=${#array[@]} echo $length for ((i=0; i<$length;