EliasFarhan / NekoEngine

Generic 3d engine based on SDL2 and OpenGL ES 3/WebGL2
13 stars 5 forks source link

Comment utiliser les allocateurs ? #28

Closed StephenGrosjean closed 4 years ago

StephenGrosjean commented 4 years ago

J'ai le constructeur du String, mais je ne comprend pas comment et qu'es-ce que je doit utiliser pour allouer de l'espace pour les String.

String::String(Allocator* allocator)
    {
        allocator = nullptr;

        length = 0;
        data = new char[0];
    }
EliasFarhan commented 4 years ago

Je ne comprends pas pourquoi tu fais new sur tes data et que tu mets l'argument allocator de ton constructeur à nullptr. Tu veux pas stocker l'allocator? J'ai ajouté des tests sur develop pour les custom allocators pour que vous compreniez les différentes versions.

StephenGrosjean commented 4 years ago

J'essaye des choses, ce n'est pas le code final.

Donc si j'ai bien compris les exemples :

    const size_t length = 100;
    void* data = calloc(length + 1, sizeof(int));
    neko::LinearAllocator allocator = neko::LinearAllocator(sizeof(int) * (length + 1), data);

Cette partie crée un espace qui sera alloué plus tard en mémoire

int* v = (int*) allocator.Allocate(sizeof(int), alignof(int));

Cette partie prend une partie de la mémoire alloué de l'allocator pour y mettre un int.

Es-ce que j'ai bien compris?

EliasFarhan commented 4 years ago

L'espace est alloué en mémoire lors du calloc. Le Linear Allocator est la stratégie que tu utilises du côté Neko pour distribuer cet espace avec les allocator.Allocate.

Ce n'est pas à toi de gérer l'allocator, on t'en a donné un et tu demandes de la place pour ta string ou tu désalloues et c'est tout.

StephenGrosjean commented 4 years ago

Mais je doit bien créer un allocator a un moment ou à un autre? Ou bien ils sont déjà là et je doit les utiliser

StephenGrosjean commented 4 years ago

Voila ce que j'ai compris (Le test fonctionne) Je ne sais pas par contre si j'ai besoin de faire autre chose...

TEST(Engine, TestLinearAllocator)
{
    const size_t length = 500;
    void* data = calloc(length + 1, sizeof(neko::String));
    neko::LinearAllocator allocator = neko::LinearAllocator(sizeof(neko::String) * (length + 1), data);

    for (size_t i = 0; i < length; i++)
    {
        neko::String* s1 = (neko::String*) allocator.Allocate(sizeof(neko::String), alignof(neko::String));

        *s1 = rand();

    }
    std::cout << "Used Memory: " << allocator.GetUsedMemory() << "B for total size: " << allocator.GetSize() << "B"
              << std::endl;
    allocator.Clear();
    free(data);

}
EliasFarhan commented 4 years ago

Je préfèrerai avoir l'allocator dans neko::String pour avoir du beau RAII. Surtout tu calloc la taille d'une string, mais c'est combien en tout? "Coucou".length != "Foo".length, c'est à neko::String d'allouer la taille pour les nouvelles string.