// finding out array access computations // cl /FatestArrayEfficiency.asm testArrayEfficiency.cpp void main() { int x[5][10]; x[2][3] = 10; // one memory access *(*(x+2)+3) = 20; // completely the same as above *((int *)(x+2)+3) = 30; // completely the same as above // x --> int (*)[10] // x[2] --> int * // &x[2] --> int (*)[10] // x[2][3] --> int // &x[2][3] --> int * int i, **y; y = new int *[5]; for (i=0; i<5; i++) y[i] = new int[10]; y[2][3] = 10; // three memory access *(*(y+2)+3) = 20; // completely the same as above *((int *)(y+2)+3) = 30; // completely the same as above for (i=0; i<5; i++) delete[] y[i]; delete[] y; } /* TITLE testArrayEfficiency.cpp .386P include listing.inc if @Version gt 510 .model FLAT else _TEXT SEGMENT PARA USE32 PUBLIC 'CODE' _TEXT ENDS _DATA SEGMENT DWORD USE32 PUBLIC 'DATA' _DATA ENDS CONST SEGMENT DWORD USE32 PUBLIC 'CONST' CONST ENDS _BSS SEGMENT DWORD USE32 PUBLIC 'BSS' _BSS ENDS _TLS SEGMENT DWORD USE32 PUBLIC 'TLS' _TLS ENDS FLAT GROUP _DATA, CONST, _BSS ASSUME CS: FLAT, DS: FLAT, SS: FLAT endif PUBLIC _main EXTRN ??2@YAPAXI@Z:NEAR ; operator new EXTRN ??3@YAXPAX@Z:NEAR ; operator delete _TEXT SEGMENT _x$ = -200 _i$ = -208 _y$ = -204 $T287 = -212 $T288 = -216 $T289 = -220 $T290 = -224 _main PROC NEAR ; File testArray1.cpp ; Line 5 push ebp mov ebp, esp sub esp, 224 ; 000000e0H ; Line 8 x[2][3] mov DWORD PTR _x$[ebp+92], 10 ; 0000000aH 92=(2*10+3)*4 ; Line 9 mov DWORD PTR _x$[ebp+92], 20 ; 00000014H ; Line 10 mov DWORD PTR _x$[ebp+92], 30 ; 0000001eH ; Line 19 push 20 ; 00000014H call ??2@YAPAXI@Z ; operator new add esp, 4 mov DWORD PTR $T287[ebp], eax mov eax, DWORD PTR $T287[ebp] mov DWORD PTR _y$[ebp], eax ; Line 20 mov DWORD PTR _i$[ebp], 0 jmp SHORT $L273 $L274: mov ecx, DWORD PTR _i$[ebp] add ecx, 1 mov DWORD PTR _i$[ebp], ecx $L273: cmp DWORD PTR _i$[ebp], 5 jge SHORT $L275 ; Line 21 push 40 ; 00000028H call ??2@YAPAXI@Z ; operator new add esp, 4 mov DWORD PTR $T288[ebp], eax mov edx, DWORD PTR _i$[ebp] mov eax, DWORD PTR _y$[ebp] mov ecx, DWORD PTR $T288[ebp] mov DWORD PTR [eax+edx*4], ecx jmp SHORT $L274 $L275: ; Line 23 y[2][3] mov edx, DWORD PTR _y$[ebp] mov eax, DWORD PTR [edx+8] ; 8=2*4 mov DWORD PTR [eax+12], 10 ; 0000000aH 12=3*4 ; Line 24 mov ecx, DWORD PTR _y$[ebp] mov edx, DWORD PTR [ecx+8] mov DWORD PTR [edx+12], 20 ; 00000014H ; Line 25 mov eax, DWORD PTR _y$[ebp] mov DWORD PTR [eax+20], 30 ; 0000001eH ; Line 27 mov DWORD PTR _i$[ebp], 0 jmp SHORT $L279 $L280: mov ecx, DWORD PTR _i$[ebp] add ecx, 1 mov DWORD PTR _i$[ebp], ecx $L279: cmp DWORD PTR _i$[ebp], 5 jge SHORT $L281 ; Line 28 mov edx, DWORD PTR _i$[ebp] mov eax, DWORD PTR _y$[ebp] mov ecx, DWORD PTR [eax+edx*4] mov DWORD PTR $T289[ebp], ecx mov edx, DWORD PTR $T289[ebp] push edx call ??3@YAXPAX@Z ; operator delete add esp, 4 jmp SHORT $L280 $L281: ; Line 29 mov eax, DWORD PTR _y$[ebp] mov DWORD PTR $T290[ebp], eax mov ecx, DWORD PTR $T290[ebp] push ecx call ??3@YAXPAX@Z ; operator delete add esp, 4 ; Line 30 mov esp, ebp pop ebp ret 0 _main ENDP _TEXT ENDS END */