ในการระบุว่าคีย์เวิร์ด register มีนัยสำคัญหรือไม่ตัวอย่างโค้ดขนาดจิ๋วจะไม่ทำ นี่คือรหัส c ที่แนะนำให้ฉันคำสำคัญการลงทะเบียนยังคงมีความสำคัญ แต่มันอาจแตกต่างกับ GCC บน Linux ฉันไม่รู้ จะลงทะเบียน int k & l ถูกเก็บไว้ใน CPU register หรือไม่? ผู้ใช้ Linux (โดยเฉพาะ) ควรรวบรวมกับ GCC และการเพิ่มประสิทธิภาพ ด้วย Borland bcc32 คีย์เวิร์ด register ดูเหมือนจะทำงาน (ในตัวอย่างนี้) เนื่องจาก & -operator จะให้รหัสข้อผิดพลาดสำหรับจำนวนเต็มที่ประกาศ บันทึก! นี่ไม่ใช่กรณีที่มีตัวอย่างเล็ก ๆ กับ Borland บน Windows! เพื่อที่จะดูว่าคอมไพเลอร์นั้นปรับให้เหมาะสมหรือไม่นั้นจะต้องเป็นตัวอย่างที่มากกว่า ลูปเปล่าจะไม่ทำ! อย่างไรก็ตาม - หากที่อยู่สามารถอ่านได้ด้วย & - ผู้ปฏิบัติงานตัวแปรจะไม่ถูกเก็บไว้ในการลงทะเบียน CPU แต่ถ้าตัวแปร register register ไม่สามารถอ่านได้ (ทำให้เกิดรหัสข้อผิดพลาดในการคอมไพล์) - ฉันต้องสมมติว่าคีย์เวิร์ด register นั้นทำให้ตัวแปรอยู่ใน CPU-register มันอาจแตกต่างกันไปตามแพลตฟอร์มต่าง ๆ ฉันไม่รู้ (หากใช้งานได้จำนวนของ "เห็บ" จะต่ำกว่ามากด้วยการประกาศการลงทะเบียน
/* reg_or_not.c */
#include <stdio.h>
#include <time.h>
#include <stdlib> //not requiered for Linux
#define LAPSb 50
#define LAPS 50000
#define MAXb 50
#define MAX 50000
int main (void)
{
/* 20 ints and 2 register ints */
register int k,l;
int a,aa,b,bb,c,cc,d,dd,e,ee,f,ff,g,gg,h,hh,i,ii,j,jj;
/* measure some ticks also */
clock_t start_1,start_2;
clock_t finish_1,finish_2;
long tmp; //just for the workload
/* pointer declarations of all ints */
int *ap, *aap, *bp, *bbp, *cp, *ccp, *dp, *ddp, *ep, *eep;
int *fp, *ffp, *gp, *ggp, *hp, *hhp, *ip, *iip, *jp, *jjp;
int *kp,*lp;
/* end of declarations */
/* read memory addresses, if possible - which can't be done in a CPU-register */
ap=&a; aap=&aa; bp=&b; bbp=&bb;
cp=&c; ccp=&cc; dp=&d; ddp=ⅆ
ep=&e; eep=ⅇ fp=&f; ffp=&ff;
gp=&g; ggp=≫ hp=&h; hhp=&hh;
ip=&i; iip=ⅈ jp=&j; jjp=&jj;
//kp=&k; //won't compile if k is stored in a CPU register
//lp=&l; //same - but try both ways !
/* what address , isn't the issue in this case - but if stored in memory some "crazy" number will be shown, whilst CPU-registers can't be read */
printf("Address a aa: %u %u\n",a,aa);
printf("Address b bb: %u %u\n",b,bb);
printf("Address c cc: %u %u\n",c,cc);
printf("Address d dd: %u %u\n",d,dd);
printf("Address e ee: %u %u\n",e,ee);
printf("Address f ff: %u %u\n",f,ff);
printf("Address g gg: %u %u\n",g,gg);
printf("Address h hh: %u %u\n",h,hh);
printf("Address i ii: %u %u\n",i,ii);
printf("Address j jj: %u %u\n\n",j,jj);
//printf("Address k: %u \n",k); //no reason to try "k" actually is in a CPU-register
//printf("Address l: %u \n",l);
start_2=clock(); //just for fun
/* to ensure workload */
for (a=1;a<LAPSb;a++) {for (aa=0;aa<MAXb;aa++);{tmp+=aa/a;}}
for (b=1;b<LAPSb;b++) {for (bb=0;bb<MAXb;bb++);{tmp+=aa/a;}}
for (a=1;c<LAPSb;c++) {for (cc=0;cc<MAXb;cc++);{tmp+=bb/b;}}
for (d=1;d<LAPSb;d++) {for (dd=0;dd<MAXb;dd++);{tmp+=cc/c;}}
for (e=1;e<LAPSb;e++) {for (ee=0;ee<MAXb;ee++);{tmp+=dd/d;}}
for (f=1;f<LAPSb;f++) {for (ff=0;ff<MAXb;ff++);{tmp+=ee/e;}}
for (g=1;g<LAPSb;g++) {for (gg=0;gg<MAXb;gg++);{tmp+=ff/f;}}
for (h=1;h<LAPSb;h++) {for (hh=0;hh<MAXb;hh++);{tmp+=hh/h;}}
for (jj=1;jj<LAPSb;jj++) {for (ii=0;ii<MAXb;ii++);{tmp+=ii/jj;}}
start_1=clock(); //see following printf
for (i=0;i<LAPS;i++) {for (j=0;j<MAX;j++);{tmp+=j/i;}} /* same double loop - in supposed memory */
finish_1=clock(); //see following printf
printf ("Memory: %ld ticks\n\n", finish_1 - start_1); //ticks for memory
start_1=clock(); //see following printf
for (k=0;k<LAPS;k++) {for (l=0;l<MAX;l++);{tmp+=l/k;}} /* same double loop - in supposed register*/
finish_1=clock(); //see following printf
printf ("Register: %ld ticks\n\n", finish_1 - start_1); //ticks for CPU register (?) any difference ?
finish_2=clock();
printf ("Total: %ld ticks\n\n", finish_2 - start_2); //really for fun only
system("PAUSE"); //only requiered for Windows, so the CMD-window doesn't vanish
return 0;
}