Si votre processeur ne prend pas en charge le matériel pour une pile de paramètres / locale mais que le compilateur essaie de toute façon d'implémenter une pile de paramètres d'exécution, et si votre code n'a pas besoin d'être rentré, vous pourrez peut-être enregistrer le code l'espace en allouant statiquement des variables automatiques. Dans certains cas, cela doit être fait manuellement; dans d'autres cas, les directives du compilateur peuvent le faire. Une allocation manuelle efficace nécessitera le partage de variables entre les routines. Un tel partage doit être fait avec soin, pour garantir qu'aucune routine n'utilise une variable qu'une autre routine considère comme "dans la portée", mais dans certains cas, les avantages de la taille du code peuvent être importants.
Certains processeurs ont des conventions d'appel qui peuvent rendre certains styles de passage de paramètres plus efficaces que d'autres. Par exemple, sur les contrôleurs PIC18, si une routine prend un seul paramètre d'un octet, il peut être passé dans un registre; si cela prend plus que cela, tous les paramètres doivent être passés en RAM. Si une routine prend deux paramètres d'un octet, il peut être plus efficace de "passer" l'un dans une variable globale, puis de passer l'autre comme paramètre. Avec des routines largement utilisées, les économies peuvent s'additionner. Ils peuvent être particulièrement importants si le paramètre transmis via global est un indicateur à bit unique, ou s'il aura généralement une valeur de 0 ou 255 (car des instructions spéciales existent pour stocker un 0 ou 255 dans la RAM).
Sur l'ARM, le fait de mettre des variables globales fréquemment utilisées ensemble dans une structure peut réduire considérablement la taille du code et améliorer les performances. Si A, B, C, D et E sont des variables globales distinctes, le code qui les utilise toutes doit charger l'adresse de chacune dans un registre; s'il n'y a pas suffisamment de registres, il peut être nécessaire de recharger ces adresses plusieurs fois. En revanche, s'ils font partie de la même structure globale MyStuff, le code qui utilise MyStuff.A, MyStuff.B, etc. peut simplement charger une fois l'adresse de MyStuff. Grande victoire.