ne fait passer les objets __m128i par référence à la fonction inline cause de ces objets qui doivent être transportés à la pile?

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

  •  01-10-2019
  •  | 
  •  

Question

Je vous écris pour fonction Transpose vecteurs 8x16bit avec intrinsics SSE2. Comme il y a 8 arguments pour cette fonction (une matrice de taille de 8x8x16bit), je ne peux pas faire autre chose que les passer par référence. Est-ce que être optimisé par le compilateur (je veux dire, ce que ces objets __m128i être transmis dans les registres à la place de la pile)?

Extrait de code:

inline void transpose (__m128i &a0, __m128i &a1, __m128i &a2, __m128i &a3,
                       __m128i &a4, __m128i &a5, __m128i &a6, __m128i &a7) {
    ....
    }
Était-ce utile?

La solution

Il y a des chances qu'ils ne seront pas poussés à la pile. Si la fonction est en ligne le compilateur fait pousser les opérations (code) de la fonction appelée dans la fonction au lieu de passer callee les données de l'appelant à l'appelé.

Maintenant, en ligne est un indice, de sorte que le compilateur peut décider de ne pas réellement en ligne l'appel et alors vous devez suivre les conseils de Zan et fait vérifier ce que l'apparence de code compilé comme.

Autres conseils

Qui peut dire?

Pourquoi ne pas compiler et regarder le démontage? C'est le seul moyen d'être sûr.

Notez que cette limitation s'applique uniquement à Windows et MSVC (++) (vous devriez probablement marquer votre question en conséquence).

Je n'ai pas essayé avec C ++ et des références, mais en utilisant MSVC et pointeurs avec inline comme celui-ci le compilateur ne semble pour optimiser la distance indirection. On peut supposer que le même s'appliquera avec les références de C, mais comme un autre a fait remarquer, vous devriez regarder le code généré pour vérifier.

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