5 typedef struct Ptr *Ptr;
6 typedef struct Ref *Ref;
19 Ref ref_new(int value)
21 Ref result = malloc(sizeof(struct Ref));
23 result->data = malloc(sizeof(int));
24 *result->data = value;
26 result->head = result->tail = NULL;
33 Ref result = malloc(sizeof(struct Ref));
35 result->data = ref->data;
37 result->head = ref->head;
38 result->tail = ref->tail;
40 for (Ptr p = ref->head; p != NULL; p = p->next)
48 void ref_add_ptr(Ref ref, Ptr ptr)
50 if (ref->head == NULL)
54 ptr->next = ptr->prev = NULL;
57 ref->tail->next = ptr;
58 ptr->prev = ref->tail;
63 void ref_remove_ptr(Ref ref, Ptr ptr)
65 for (Ptr p = ref->head; p != NULL; p = p->next)
72 p->prev->next = p->next;
77 p->next->prev = p->prev;
84 void ref_free(Ref ref)
86 for (Ptr p = ref->head; p != NULL; p = p->next)
96 Ptr result = malloc(sizeof(struct Ptr));
100 ref_add_ptr(ref, result);
107 if (ptr->ref != NULL)
108 return *ptr->ref->data;
112 void ptr_free(Ptr ptr)
114 if (ptr->ref != NULL)
115 ref_remove_ptr(ptr->ref, ptr);
121 Ref r1 = ref_new(123);
123 Ptr p1 = ptr_new(r1);
124 Ptr p2 = ptr_new(r1);
125 Ptr p3 = ptr_new(r1);
126 Ptr p4 = ptr_new(r1);
128 Ref r2 = ref_move(r1);
130 int i = ptr_get(p1) + ptr_get(p2) + ptr_get(p3) + ptr_get(p4);
143 int *r1 = malloc(sizeof(int));
151 int i = *p1 + *p2 + *p3 + *p4;
159 int main(int argc, char **argv)
161 const long N = 1000000;
166 for (long i = 0; i < N; i++)
169 printf("ref: %fms\n", ((double)(end - start)) / CLOCKS_PER_SEC * 1000);
172 for (long i = 0; i < N; i++)
175 printf("reg: %fms\n", ((double)(end - start)) / CLOCKS_PER_SEC * 1000);