// compiler avec -msse2 car on utilise xmmintrin.h
#include <stdlib.h>
#include <stdio.h>
#include <xmmintrin.h>

/**
 * classe contenant un entier utilisée pour cet exemple
 */
class MyClass {
protected:
	int value;
public:
	/**
	 * constructeur par défaut sans argument
	 */
	MyClass() {
		value = 0;
	}
	
	/**
	 * constructeur avec valeur d'initialisation
	 */
	MyClass(int v) {
		value = v;
	}
	
	/**
	 * getter
	 */
	int get_value() {
		return value;
	}
};

// ----------------------------------------------
// main function
// ----------------------------------------------
int main() {

	// allocation d'un tableau de 20 entiers
	int *tab_int;

	tab_int = (int *) malloc(20 * sizeof(int));
	// ou
	tab_int = static_cast<int *>(malloc(20 * sizeof(int)));
	// ou
	tab_int = (int *) calloc(20, sizeof(int));

	// libération de la mémoire allouée
	free(tab_int);


	// ==================================
	// allocation avec alignement
	// ==================================

	tab_int = (int *) _mm_malloc(20 * sizeof(int), 16);

	// libération de la mémoire allouée par _mm_malloc
	_mm_free(tab_int);


	// tableau de 100 Person
	MyClass *tab_object;

	tab_object = (MyClass *) malloc(100 * sizeof(MyClass));
	// ou
	tab_object = static_cast<MyClass *>(malloc(100 * sizeof(MyClass)));
	// ou, mais nécessite de déclarer le constructeur par défaut sans arguments
	tab_object = new MyClass[ 100 ];

	for (int i=0; i<100; ++i) {
		printf("%d ", tab_object[i].get_value() );
	}
	// libération
	free(tab_object);
	 
	return 0;
} 
