Est-il jamais de sens pour un compilateur de passer d'une structure comme celui-ci dans un registre cpu à une fonction?

StackOverflow https://stackoverflow.com/questions/4213107

Question

Je voudrais savoir si une sorte de structure contient plus d'une primitive mais sa taille totale est inférieure ou égale à la taille d'un seul registre cpu comme un registre de 4 octets, est-il jamais de sens pour un compilateur pour le mettre dans un de ces registres de 4 octets lors du passage par valeur ou référence à une fonction au lieu de faire une copie de celui-ci sur la pile de l'appelé ou le passage d'un pointeur vers elle et en général, lors du passage de quelque chose de plus qu'une seule primitive à une fonction comme un tableau ou une structure se passant dans un registre cpu jamais être utile?

échantillon de cette structure:

struct sample{
 public:
  char char1;
  char char2;
};

échantillon consistant à faire passer la structure à une fonction:

void someFunc(const sample input){
 //whatever
}
void someFunc(sample input){
 //whatever
}
void someFunc(sample & input){
 //whatever
}
void someFunc(const sample & input){
 //whatever
}
Était-ce utile?

La solution

Oui. De nombreux compilateurs ont un mot clé spécial ou un attribut de type que vous pouvez utiliser pour spécifier qu'une structure doit être adoptée dans des registres plutôt que sur la pile. Il est plus fréquent sur les processeurs qui ont de nombreux registres et pipelines profonds, comme le PowerPC, et peut être une amélioration des performances exceptionnelles dans les architectures où l'écriture d'une valeur à la mémoire, puis le lire à nouveau provoque tout de suite d'une cabine de conduite.

En général, vous ne l'utiliser pour une struct qui est la même taille qu'un registre natif. En particulier, il est utile sur les processeurs qui ont de larges registres SIMD, qui peuvent passer 16 octets à la fois ou plus. Cela vous permettra de passer (par exemple) un registre sur un 4 vectoriel de dimension (quatre flotteurs). système V d'AMD est un exemple d'un ABI x86 qui permet.

Un autre exemple est l'attribut de type d64_abi de GCC, qui indique un PowerPC pour passer une structure sur les registres lorsque cela est possible, plutôt que sur la pile. (Cela fait partie de la Darwin ABI ).

typedef struct {
    int          a;
    float        f;
    char         c;
} __attribute__ ((d64_abi)) Thingy;

Thingy foo( Thingy t );

Dans le cas ci-dessus, un appel à Foo passerait le Thingy sur un registre à virgule flottante et deux registres int, plutôt que d'écrire à la pile et le lire retour à nouveau. La valeur de retour revient sur les registres de la même manière.

Je ne l'ai jamais vu un compilateur qui fait automatiquement, sans que vous le précisiez, mais il est possible existe.

Autres conseils

Il est défini dans le application d'interface binaire (ABI) de votre environnement d'exécution. La norme ne dit rien sur les registres du processeur lorsqu'une fonction est appelée, il est légal de créer un environnement où les petits struct sont emballés dans un seul registre de processeur.

Pour la pièce de référence, ils sont très susceptibles d'être transmises en tant que pointeurs de toute façon, depuis quand l'intérieur de la fonction appelée l'adresse d'une référence est prise, il doit résoudre à l'adresse de l'objet référencé.

Sur certaines architectures (comme i386, je sais qu'il est ancien, mais c'est ce que j'ai grandi avec;) il est certainement judicieux de le transmettre dans un registre, car pousser et sauter de la pile prendre beaucoup plus (disons entre 3 -6 fois plus) cycles de CPU comme passant par le registre. Donc, un compilateur ferait un bon travail, pour optimiser.

Je peux imaginer qu'il existe d'autres architectures où il n'a pas d'importance. Ou si les registres sont utilisés pour d'autres optimisations qui donnent une plus grande amélioration, il n'a pas de sens de les utiliser pour cela.

Quelle architecture utilisez-vous / ciblage, ou demandez-vous en général?

Je pense qu'il ya des compilateurs qui passent PODs dans les registres, même si elles sont structs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top