samedi 28 juin 2014

Tableaux de taille variable

Dernière dans la liste des features C++14 dont je parlerai pour g++4.9, voici les tableaux à taille variable. Alors que jusqu'à présent, la taille d'un tableau créé sur la pile devait être une constante, g++4.9 permet de prendre une variable à la place. Le standard ne définit pas si la mémoire allouée par un tableau de taille variable doit l'être sur la pile ou sur le tas, mais l'idée, bien entendu, est de favoriser la pile et économiser ainsi une allocation coûteuse.

Voyons sans plus attendre un programme d'exemple:

#include <iostream>

int main(int argc, char ** argv)
{
  int array[argc];
  for(int index = 0; index < argc; ++index)
  {
    array[index] = index;
  }
  
  for(int index : array)
  {
    std::cout << index << std::endl;
  }

  return 0;
}

Le programme met dans un tableau la liste des entiers de 0 au nombre d'arguments de la commande. Valgrind confirme qu'aucune allocation n'a été effectuée, le tableau a donc été créé sur la pile.

==15403== HEAP SUMMARY:
==15403==     in use at exit: 0 bytes in 0 blocks
==15403==   total heap usage: 1 allocs, 1 frees, 20 bytes allocated
==15403== 
==15403== All heap blocks were freed -- no leaks are possible

Pour le fun, j'ai ré-implémenté le même programme en utilisant un std::vector, et Valgrind indique bien une allocation.

La même syntaxe étant utilisée pour les tableaux fixes et variables, je pense qu'il y a un réel risque d'utiliser l'un en pensant utiliser l'autre. D'un côté, il faudra faire attention à ne pas exploser la pile. De l'autre, il est tellement peu courant de nos jours d'utiliser un tableau directement (std::array est passé par là), que le programmeur devrait savoir à quoi s'attendre. Et parfois, économiser une microseconde dans une routine peut faire toute la différence.

Aucun commentaire: