Опубликован: 12.07.2012 | Доступ: свободный | Студентов: 355 / 24 | Оценка: 4.00 / 4.20 | Длительность: 11:07:00
Специальности: Программист
Лекция 9:

Optimizing compiler. Static and dynamic profiler. Memory manager. Code generator

Linked lists in memory

Linked list

Рис. 9.2. Linked list
Can be allocated in memory

Рис. 9.3. Can be allocated in memory
And in the physical memory

Рис. 9.4. And in the physical memory

Memory manager for array of pointers

#include <stdlib.h>
#include <stdio.h>
#define N 10000
typedef struct {
  int x,y,z;
} VecR;
typedef VecR* VecP;
 int main() {
int i,k;
VecP a[N],b[N];
VecR *tmp,*tmp1;
 #ifndef PERF
for(i=0;i<N;i++){
  a[i]=(VecP)malloc(sizeof(VecR));
  b[i]=(VecP)malloc(sizeof(VecR));
}
#else
tmp=(VecR*)malloc(sizeof(VecR)*N);
tmp1=(VecR*)malloc(sizeof(VecR)*N);
for(i=0;i<N;i++) {
  a[i]=(VecP)&tmp[i];
 b[i]=(VecP)&tmp1[i];
}
#endif 
for (i=0;i<N;i++){
 a[i]->x = 1.0; b[i]->x = 2.0;
 a[i]->y = 2.0; b[i]->y = 3.0;
 a[i]->z = 0.0; b[i]->z = 4.0;
}
 
for(k=1;k<N;k++)
 for (i=k;i<N-20;i++){
  a[i]->x = b[i+10]->y+1.0;
  a[i]->y = b[i+10]->x+a[i+1]->y;
  a[i]->z = (a[i-1]->y - a[i-1]->x)/b[i+10]->y;
 }
printf("%d \n",a[100]->z);
}
icc struct.c -fast -o a.out 
icc struct.c -fast -DPERF -o b.out 
time ./a.out   real    0m0.998s
time ./b.out   real    0m0.782s

There is a popular way in C++ to improve work with dynamically allocated memory through the use of containers.

Creation and use of containers is one example of effective template use in C++. The most common set of containers provided by Standard Template Library (STL), which comes with a modern C++ compilers.

It looks, however, the STL is mainly designed for flexibility of use and performance issues have a lower priority. Therefore, the expansion of container size is performed step by step and many containers doesn’t have a constructor allowing to define the initial memory amount should be allocated. In the case of expansion the container may need to copy the its contents. Such copy is performed via copy constructors and can make performance worse.

A popular method for object memory allocation is memory pools method. In this case memcpy can be used for pool expansion.


Рис. 9.5.