Module C++ INSA 4AE
Find a file
2023-10-05 12:13:16 +02:00
exercice Rewrote cmake. Added multiple target for both the td and exercices. 2023-09-25 08:59:27 +02:00
td TD5 finished. 2023-10-04 14:39:30 +02:00
tp TP 1, question 4 2023-10-05 12:13:16 +02:00
.gitignore Etape 5 2023-09-18 08:57:37 +02:00
CMakeLists.txt Added TP_INSA Cmake project. Boilerplate for the TP. 2023-10-05 08:47:15 +02:00
LICENSE Initial commit 2023-09-13 15:01:39 +02:00
README.md Added TP_INSA Cmake project. Boilerplate for the TP. 2023-10-05 08:47:15 +02:00
run.bat Added TD2 and done question 1. Added Windows Support for run script. 2023-10-02 22:26:27 +02:00
run.sh Rewrote cmake. Added multiple target for both the td and exercices. 2023-09-25 08:59:27 +02:00

Module C++ INSA 4AE

Compiler le projet

Préparer la compilation

Pour compiler le projet je recommande CMake, mais il est possible d'utiliser directement 'g++'/'gcc'. Une simple commande vous permet de préparer les fichiers dépendant de l'étape pour le td ou l'exercice :

mkdir build
cd build
cmake -DETAPE=2 -DTD=1 ..

Dans cet exemple, l'étape 2 et le td 1 seront construits. Le tp lui n'a pas besoin de nombre particulier.

Lancer la compilation

Il suffit ensuite de construire l'executable dans le dossier désiré

cmake --build . --target <target_name>

<target_name> étant soit td_insa, exercice_insa ou tp_insa

Conseil pour compiler et executer efficacement

Je vous suggère d'aller dans le dossier contenant l'executable dès que les deux étapes sont réalisées. Il vous suffit ensuite de lancer le script .sh ou .bat pour à la fois compiler et executer le code.

Pour cela rendez vous à la racine du projet après avoir crée et préparer le build :

./run.sh <target_name>

Pour GNU GCC/G++ sur Linux

./run.bat <target_name>

Pour Powershell sur Windows

run.bat <target_name>

Pour CMD sur Windows

<target_name> étant soit td_insa, exercice_insa ou tp_insa

Test des allocations entre la bibliothèque standard et mon implémentation

Voici le code testé :

std::vector<int> vectStd;
Vector<int> vectYoyo;
int capacityStd(0), capacityYoyo(0);
size_t tempCapacityStd(0), tempCapacityYoyo(0);
for(int i=0; i<15000; i++)
{
    vectYoyo.PushBack(i);
    vectStd.push_back(i);
    if(tempCapacityStd != vectStd.capacity())
        capacityStd++;
    if(tempCapacityYoyo != vectYoyo.Capacity())
        capacityYoyo++;
    tempCapacityStd = vectStd.capacity();
    tempCapacityYoyo = vectYoyo.Capacity();
}
std::cout << "Total Yoyo Reallocations: " << capacityYoyo << "\tFinal Capacity: " << tempCapacityYoyo << std::endl;
std::cout << "Total Std Reallocations: " << capacityStd << "\tFinal Capacity: " << tempCapacityStd << std::endl;

Avec le résultat :

Total Yoyo Reallocations: 15    Final Capacity: 16384
Total Std Reallocations: 25     Final Capacity: 18207

Mon implémentation possède donc moins de réallocations, ainsi qu'une capacité finale moins grande. (Par comparaison, une simple implémentation augmentant la capacité _capacity++ à chaque push_back() aurait autant de réallocation que de capacité finale. Bien qu'une capacité finale moins élevée.)