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.

samedi 21 juin 2014

Nombres en binaire

Continuons sur notre exploration de g++4.9. Toujours pas révolutionnaire, mais plutôt utile, la possibilité d'avoir des constantes binaires dans le code source. En plus de la notation 0x pour l'hexadécimal et 0 pour l'octal, voici 0b pour le binaire. Démonstration:

#include <iostream>

int main()
{
  std::cout << 130 << std::endl;
  std::cout << 0x1a << std::endl;
  std::cout << 077 << std::endl;
  std::cout << 0b1000 << std::endl;
  std::cout << 0b110'1000 << std::endl;

  return 0;
}

Le programme affiche:

130
26
63
8
104

Notons que les séparateurs de chiffres, décrits ici, fonctionnent aussi bien pour le binaire, ce qui va certainement améliorer la lisibilité.

lundi 9 juin 2014

Un Ohmmètre improvisé

Installation de luminaires, aujourd'hui. Une fois coupé le câble pour le raccourcir, surprise, les fils électriques ne sont pas marqués! Nous nous sommes retrouvés gros-Jean comme devant, avec nos trois fils d'un côté et les douilles de l'autre.

Après avoir tourné dans l'appart' à la recherche de quelque chose pour trouver le bon fil, j'ai finalement eu une idée: utiliser les fils des haut-parleurs de la hifi.

Donc, on met la musique, puis débranchage d'un des fils du haut-parleur, contact avec une des bornes dans la douille d'un côté, et contact avec un des fils de la lampe dans le haut parleur de l'autre. Essayer les deux bornes de la douille. Musique, pas musique, phase, neutre, et terre!

C'est quand même plus pratique avec un vrai ohmmètre. Ça fera un bon cadeau de Noël.