Articles of optimisation du compilateur

Pourquoi l’affectation de chaîne n’est-elle pas optimisée lorsque le compilateur connaît la longueur?

Je jouais avec un peu de code de synchronisation aujourd’hui et j’ai découvert que, lors de l’atsortingbution d’un littéral de chaîne à std :: ssortingng, il était environ 10% plus rapide (avec une chaîne courte de 12 caractères, donc une différence encore plus grande pour les grandes chaînes) avec un littéral de longueur connue (en […]

Les compilateurs C ++ évitent-ils la copie lors du renvoi par valeur?

Considérons le code suivant: LargeObject getLargeObject() { LargeObject glo; // do some initialization stuff with glo return glo; } void test() { LargeObject tlo = getLargeObject(); // do sth. with tlo; } Un compilateur simple créerait un glo LargeObject local sur la stack getLargeObject (), puis l’atsortingbuerait à tlo dans test () lors du retour, […]

Comment définir l’atsortingbut ICC «fp-model precise» pour une seule fonction, afin d’éviter les optimisations associatives?

J’implémente Kahan summation dans un projet prenant en charge la compilation avec gcc47, gcc48, clang33, icc13 et icc14. Dans le cadre de cet algorithme, j’aimerais désactiver les optimisations qui tirent parti de l’associativité de l’addition de nombres réels. (Les opérations en virgule flottante ne sont pas associatives.) Je souhaite désactiver ces optimisations uniquement dans la […]

Est-ce que l’un des compilateurs C ++ actuels émet «rep movsb / w / d»?

Cette question m’a fait me demander si les compilateurs modernes actuels n’émettraient jamais d’ REP MOVSB/W/D Sur la base de cette discussion , il semble que l’utilisation de REP MOVSB/W/D pourrait être bénéfique pour les processeurs actuels. Mais peu importe comment j’ai essayé, je ne peux pas obliger les compilateurs actuels (GCC 8, Clang 7, […]

Comment le compilateur C ++ peut-il optimiser un downcast hiérarchique incorrect afin de provoquer un véritable comportement non défini

Prenons l’exemple suivant: class Base { public: int data_; }; class Derived : public Base { public: void fun() { ::std::cout << "Hi, I'm " << this << ::std::endl; } }; int main() { Base base; Derived *derived = static_cast(&base); // Undefined behavior! derived->fun(); return 0; } L’appel de fonction est évidemment un comportement indéfini […]

Choix du compilateur de ne pas utiliser l’instruction REP MOVSB ​​pour un déplacement de tableau d’octets

Je vérifie la version Release de mon projet réalisée avec la dernière version du compilateur VS 2017 C ++. Et je suis curieux de savoir pourquoi le compilateur a choisi de générer l’extrait de code suivant: //ncbSzBuffDataUsed of type INT32 UINT8* pDst = (UINT8*)(pMXB + 1); UINT8* pSrc = (UINT8*)pDPE; for(size_t i = 0; i […]

Le compilateur peut-il et optimise-t-il deux charges atomiques?

Les deux charges seront-elles combinées à une seule dans de tels scénarios? Si cela dépend de l’architecture, qu’en est-il des processeurs modernes de Intel, par exemple? Je pense que les charges atomiques sont équivalentes aux charges normales des processeurs Intel. void run1() { auto a = atomic_var.load(std::memory_order_relaxed); auto b = atomic_var.load(std::memory_order_relaxed); // Some code using […]

Pourquoi vector :: push_back de la variable locale n’est-il pas optimisé?

En C ++ 11, vous pouvez utiliser std::vector::push_back en combinaison avec std::move pour éviter les copies lors de l’insertion d’éléments dans un vecteur. Existe-t-il une section dans la norme qui interdit aux compilateurs d’utiliser std::move automatiquement avec des variables locales qui ne sont pas utilisées après les appels à push_back ? Lorsque vous remplissez des […]

Forcer GCC à ne pas optimiser une variable non utilisée?

L’un des espaces de noms de mon programme est réparti entre deux fichiers. L’un fournit le “moteur”, l’autre utilise le “moteur” pour exécuter diverses commandes. Toutes les initialisations sont effectuées du côté “moteur”, y compris les parameters de mise en cache extraits de la bibliothèque d’installation. Donc, il y a engine.cpp avec: #include #include “ns.h” […]

Des compilateurs C ou C ++ optimisent-ils les macros de définition?

Disons que j’ai les éléments suivants en C ou C ++: #include #define ROWS 15 #define COLS 16 #define COEFF 0.15 #define NODES (ROWS*COLS) #define A_CONSTANT (COEFF*(sqrt(NODES))) Ensuite, je vais utiliser NODES et A_CONSTANT quelque part au fond de nombreuses boucles nestedes (c’est-à-dire utilisées plusieurs fois). Clairement, les deux ont des valeurs numériques qui peuvent […]