Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2015-12-13T17:42:36+01:00Les derniers messages parus sur le forum de Zeste de Savoir.Pb constructeur par déplacement, message #896032015-12-13T17:42:36+01:00El Poulpos/@El%20Poulposhttps://zestedesavoir.com/forums/sujet/4824/pb-constructeur-par-deplacement/?page=1#p89603<p>ok merci ,je vais regarder ça ce soir.</p>Pb constructeur par déplacement, message #895792015-12-13T14:41:12+01:00Olybri/@Olybrihttps://zestedesavoir.com/forums/sujet/4824/pb-constructeur-par-deplacement/?page=1#p89579<p>Testé sous Windows 8 avec GCC 5.2 également :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3</pre></div></td><td class="code"><div class="codehilite"><pre>>g++ -std=c++14 code.cpp && a
Constructeur
Appel constructeur de copie
</pre></div>
</td></tr></table>
<p>Donc soit tu as modifié quelque chose dans ton code, soit il y a une option qui fait foirer le truc. Difficile d'en dire plus pour ma part…</p>Pb constructeur par déplacement, message #895732015-12-13T13:35:43+01:00El Poulpos/@El%20Poulposhttps://zestedesavoir.com/forums/sujet/4824/pb-constructeur-par-deplacement/?page=1#p89573<blockquote>
<p>N'aurais-tu pas par mégarde laissé l'option -fno-elide-constructors dont jo_link_noir parlait plus haut ?</p>
</blockquote>
<p>Non je viens de vérifier et la ma version de mon compilateur est gnu gcc 5.2</p>Pb constructeur par déplacement, message #895642015-12-13T12:51:01+01:00Olybri/@Olybrihttps://zestedesavoir.com/forums/sujet/4824/pb-constructeur-par-deplacement/?page=1#p89564<figure><blockquote>
<p>Merci de ta réponse mais ces options étaient déjà activées.
</p>
</blockquote>
<figcaption><p><a href="http://zestedesavoir.com/forums/sujet/4824/pb-constructeur-par-deplacement/?page=1#p89552">Octodex</a></p></figcaption></figure><p>D'ailleurs je viens de tester avec GCC et Clang, et cette optimisation a lieu même sans l'option <code>-O2</code>. N'aurais-tu pas par mégarde laissé l'option <code>-fno-elide-constructors</code> dont <a href="https://zestedesavoir.com/forums/sujet/4824/pb-constructeur-par-deplacement/?page=1#p89502">jo_link_noir</a> parlait plus haut ?</p>
<p>Sinon, peux-tu donner une liste complète des options activées ainsi que la version de ton compilateur ?</p>Pb constructeur par déplacement, message #895522015-12-13T12:06:56+01:00El Poulpos/@El%20Poulposhttps://zestedesavoir.com/forums/sujet/4824/pb-constructeur-par-deplacement/?page=1#p89552<p>Merci de ta réponse mais ces options étaient déjà activées :</p>
<p><img alt="Image utilisateur" src="https://zestedesavoir.com/media/galleries/2117/afef5ef7-5cfd-4a35-8f6d-62e15773d036.png">.</p>Pb constructeur par déplacement, message #895492015-12-13T11:57:42+01:00Olybri/@Olybrihttps://zestedesavoir.com/forums/sujet/4824/pb-constructeur-par-deplacement/?page=1#p89549<figure><blockquote>
<p>Le mode release n'est pas censé optimisé le plus possible le code ?
</p>
</blockquote>
<figcaption><p><a href="http://zestedesavoir.com/forums/sujet/4824/pb-constructeur-par-deplacement/?page=1#p89524">Octodex</a></p></figcaption></figure><p>A vrai dire, il y n'a pas de mode "release" ou "debug" pour le compilateur. Ce sont sont justes deux cibles que ton IDE te propose, et chacune d'entre elles va compiler avec des options différentes.</p>
<p>Le plus souvent, on trouvera en release l'option <code>-O2</code> (optimisation), et également l'option <code>-s</code> pour le linking (pas de table de symbole dans l'exécutable). Veille à ce qu'elles soient bien activées.</p>Pb constructeur par déplacement, message #895242015-12-13T00:20:39+01:00El Poulpos/@El%20Poulposhttps://zestedesavoir.com/forums/sujet/4824/pb-constructeur-par-deplacement/?page=1#p89524<p>Ah oui et une dernière question je viens de passer en mode release et là l'optimisation ne se fait pas et j'ai bien affiché dans ma console "Constructeur par déplacement" Le mode release n'est pas censé optimiser le plus possible le code ?</p>Pb constructeur par déplacement, message #895072015-12-12T20:54:49+01:00El Poulpos/@El%20Poulposhttps://zestedesavoir.com/forums/sujet/4824/pb-constructeur-par-deplacement/?page=1#p89507<p>J'ai compris ,merci d'avoir pris le temps de me répondre <img alt=":)" src="/static/smileys/smile.png"></p>Pb constructeur par déplacement, message #895022015-12-12T19:06:27+01:00jo_link_noir/@jo_link_noirhttps://zestedesavoir.com/forums/sujet/4824/pb-constructeur-par-deplacement/?page=1#p89502<p>Effectivement, c'est plus une copie élision: <a href="http://en.cppreference.com/w/cpp/language/copy_elision">http://en.cppreference.com/w/cpp/language/copy_elision</a></p>
<p>@Octodex, si tu veux tester sans l'optimisation, il y a l'option -fno-elide-constructors pour gcc.</p>Pb constructeur par déplacement, message #894812015-12-12T16:18:02+01:00gbdivers/@gbdivershttps://zestedesavoir.com/forums/sujet/4824/pb-constructeur-par-deplacement/?page=1#p89481<p>Le remplacement de "constructeur de conversion + affectation par déplacement" par un simple constructeur de conversion est une optimisation, qui doit respecter la sémantique de la classe. Si le déplacement n'est pas autorisé, l'optimisation n'est pas autorisée.</p>
<p>HS : @jo_link_noir: je ne crois pas que ce soit un RVO. Je crois que c'est un cas particulier d'optimisation, autorisé explicitement dans la norme. (A priori, cf : <a href="http://en.cppreference.com/w/cpp/language/copy_initialization)">http://en.cppreference.com/w/cpp/language/copy_initialization)</a></p>Pb constructeur par déplacement, message #894802015-12-12T16:15:22+01:00jo_link_noir/@jo_link_noirhttps://zestedesavoir.com/forums/sujet/4824/pb-constructeur-par-deplacement/?page=1#p89480<p>Il faut séparer l'analyse du code et l'optimisation faite par le compilateur. Si le code n'est pas valide, le compilateur ne cherche pas à l'optimiser et jette une erreur.</p>Pb constructeur par déplacement, message #894692015-12-12T14:36:03+01:00El Poulpos/@El%20Poulposhttps://zestedesavoir.com/forums/sujet/4824/pb-constructeur-par-deplacement/?page=1#p89469<p>Merci de ta réponse cependant si le compilateur ne passe pas par le constructeur de déplacement pourquoi lorsque je fais :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="codehilite"><pre><span class="n">Testun</span><span class="p">(</span><span class="n">Testun</span> <span class="o">&&</span><span class="n">t</span><span class="p">)</span><span class="o">=</span><span class="k">delete</span><span class="p">;</span>
</pre></div>
</td></tr></table>
<p>J'ai une erreur du compilateur me disant qu'il ne peut pas faire :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="codehilite"><pre><span class="n">Testun</span> <span class="n">a</span><span class="o">=</span><span class="n">Testun</span><span class="p">()</span>
</pre></div>
</td></tr></table>Pb constructeur par déplacement, message #894672015-12-12T14:30:02+01:00jo_link_noir/@jo_link_noirhttps://zestedesavoir.com/forums/sujet/4824/pb-constructeur-par-deplacement/?page=1#p89467<blockquote>
<p>Il va créer directement un seul objet identique à Testun(5) au lieu de passer par le constructeur par déplacement.C'est ça ?</p>
</blockquote>
<p>Exactement, c'est ce qu'on appelle la RVO (Return Value Optimization).</p>
<p><a href="http://cpp.developpez.com/faq/cpp/?page=Optimisation#Qu-est-ce-que-la-RVO">http://cpp.developpez.com/faq/cpp/?page=Optimisation#Qu-est-ce-que-la-RVO</a>
(Il n'y a pas de fonction dans ton code, mais le principe reste le même.)</p>Pb constructeur par déplacement, message #894552015-12-12T13:41:35+01:00El Poulpos/@El%20Poulposhttps://zestedesavoir.com/forums/sujet/4824/pb-constructeur-par-deplacement/?page=1#p89455<p>Merci Ksass`Peuk pour ta réponse du coup j'obtiens</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2</pre></div></td><td class="code"><div class="codehilite"><pre>Constructeur
Constructeur de copie
</pre></div>
</td></tr></table>
<p>Donc apparemment lorsque le compilateur voit :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="codehilite"><pre><span class="n">Testun</span> <span class="n">a</span><span class="o">=</span><span class="n">Testun</span><span class="p">(</span><span class="mi">9</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p>Il va créer directement un seul objet identique à Testun(5) au lieu de passer par le constructeur par déplacement.C'est ça ?</p>Pb constructeur par déplacement, message #894402015-12-12T12:38:56+01:00Ksass`Peuk/@Ksass%60Peukhttps://zestedesavoir.com/forums/sujet/4824/pb-constructeur-par-deplacement/?page=1#p89440<p>Ajoutes un affichage dans ton constructeur qui prend un "int" en entrée. Tu vas comprendre ce qui se passe. Le compilateur est un gros malin.</p>Pb constructeur par déplacement, message #894382015-12-12T12:28:33+01:00El Poulpos/@El%20Poulposhttps://zestedesavoir.com/forums/sujet/4824/pb-constructeur-par-deplacement/?page=1#p89438<p>Merci , je n'avais pas fais attention.</p>Pb constructeur par déplacement, message #894302015-12-12T11:42:41+01:00Fumble/@Fumblehttps://zestedesavoir.com/forums/sujet/4824/pb-constructeur-par-deplacement/?page=1#p89430<p>Bonjour,</p>
<p>Je déplace le sujet dans le forum "Programmation". Merci de poster au bon endroit la prochaine fois. <img alt=":)" src="/static/smileys/smile.png"></p>Pb constructeur par déplacement, message #894232015-12-12T11:05:48+01:00El Poulpos/@El%20Poulposhttps://zestedesavoir.com/forums/sujet/4824/pb-constructeur-par-deplacement/?page=1#p89423<p>Bonjour à tous,
Pour satisfaire ma curiosité j'ai voulu testé une classe très simple ayant un constructeur de copie et un constructeur par déplacement.Et dans le main j'ai crée deux instances de cette classe.A la première j'ai affecté à mon premier objet un autre objet du même type afin d'utiliser le constructeur de copie et j'ai affecté à mon deuxième objet un objet temporaire afin d'utiliser le constructeur par déplacement. Voici le code : </p>
<p>Testun.h</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15</pre></div></td><td class="code"><div class="codehilite"><pre><span class="cp">#ifndef TESTUN_H_INCLUDED</span>
<span class="cp">#define TESTUN_H_INCLUDED</span>
<span class="k">class</span> <span class="nc">Testun</span>
<span class="p">{</span>
<span class="k">public</span> <span class="o">:</span>
<span class="n">Testun</span><span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">);</span>
<span class="n">Testun</span><span class="p">(</span><span class="n">Testun</span> <span class="o">&&</span><span class="n">t</span><span class="p">)</span> <span class="p">;</span>
<span class="n">Testun</span><span class="p">(</span><span class="k">const</span> <span class="n">Testun</span> <span class="o">&</span><span class="n">t</span><span class="p">);</span>
<span class="o">~</span><span class="n">Testun</span><span class="p">();</span>
<span class="k">private</span> <span class="o">:</span>
<span class="kt">int</span> <span class="n">m_a</span><span class="p">;</span>
<span class="p">};</span>
<span class="cp">#endif </span><span class="c1">// TESTUN_H_INCLUDED</span>
</pre></div>
</td></tr></table>
<p>Testun.cpp</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18</pre></div></td><td class="code"><div class="codehilite"><pre><span class="cp">#include "Testun.h"</span>
<span class="cp">#include <iostream></span>
<span class="n">Testun</span><span class="o">::</span><span class="n">Testun</span><span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">)</span><span class="o">:</span><span class="n">m_a</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
<span class="p">{</span>
<span class="p">}</span>
<span class="n">Testun</span><span class="o">::</span><span class="n">Testun</span><span class="p">(</span><span class="n">Testun</span> <span class="o">&&</span><span class="n">t</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="o"><<</span><span class="s">"Appel constructeur par déplacement"</span><span class="o"><<</span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">Testun</span><span class="o">::</span><span class="n">Testun</span><span class="p">(</span><span class="k">const</span> <span class="n">Testun</span> <span class="o">&</span><span class="n">t</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="o"><<</span><span class="s">"Appel constructeur de copie"</span><span class="o"><<</span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">Testun</span><span class="o">::~</span><span class="n">Testun</span><span class="p">()</span>
<span class="p">{</span>
<span class="p">}</span>
</pre></div>
</td></tr></table>
<p>main.cpp</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11</pre></div></td><td class="code"><div class="codehilite"><pre><span class="cp">#include <iostream></span>
<span class="cp">#include "Testun.h"</span>
<span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
<span class="n">Testun</span> <span class="n">a</span><span class="o">=</span><span class="n">Testun</span><span class="p">(</span><span class="mi">9</span><span class="p">);</span> <span class="c1">// Ici le constructeur par déplacement devrait être appelé ,non ?</span>
<span class="n">Testun</span> <span class="n">b</span><span class="o">=</span><span class="n">a</span><span class="p">;</span>
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</td></tr></table>
<p>Le problème vient du fait que le constructeur par déplacement n'est jamais appelé alors qu'un objet temporaire est pourtant affecté à mon objet a.
Je remercie d'avance ceux qui pourront m'aider.Bonne journée à tous <img alt=":)" src="/static/smileys/smile.png"> .</p>
<p>Edit : Je viens de me rendre compte que je me suis lamentablement trompé de forum en postant ce sujet,veuillez m'excuser <img alt=":(" src="/static/smileys/triste.png"></p>