Salut à tous !
Me voici, petit nouveau sur ce forum. Pour mon premier message, j'ai une question assez technique. Laissez-moi tout d'abord vous expliquer un peu le contexte : je participe au développement d'un nouveau modèle océanographique. Il se base sur un projet plus ancien, développé par des physiciens qui ont découvert la programmation sur le tas, d'abord en Fortran puis en C. Maintenant, le code migre vers du C++. Je vous laisse imaginer le mélange... Le plus étonnant, c'est qu'il est plutôt performant, notamment en comparaison des modèles déjà existant.
Dans certains cas, un calcul peut-être effectué de plusieurs manières, en fonction de la précision désirée. Pour pouvoir faire le choix en cours d'exécution, la procédure de calcul est envoyé sous forme de pointeur de fonction. Le problème, c'est qu'alors le polymorphisme est délicat et que les performances peuvent être médiocres, surtout en comparaison des foncteurs. Je propose donc de passer à cette dernière solution. Avant de changer le code, il m'a été demandé de faire un petit exemple et du profilage, d'abord juste avec la bibliothèque standard, ensuite avec Boost.
Et de m'exécuter.
Cependant, j'ai un petit problème. Soit le code suivant --- il compile, mais ne fait rien, j'essaye juste d'isoler mon problème et de montrer la hiérarchie que j'ai mise en place sans plus noyer le poisson, c'est déjà assez long comme cela :
Par contre, si je change la définition de ma classe FonctionSimple de la sorte :
Code : Sélectionner tout - Visualiser dans une fenêtre à part 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
Alors j'obtiens l'erreur suivante à l'édition des liens (et non pas à la compilation) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sachant que mon idée est d'en arriver finalement à quelque chose de ce genre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part 
2
3
4
5
6
7
8
9
Pour pouvoir ensuite faire ce genre de choses :
Code : Sélectionner tout - Visualiser dans une fenêtre à part 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Je dois admettre que je ne comprends pas pourquoi cette erreur apparaît, ni surtout pourquoi elle a lieu à l'édition des liens. D'après Luc Hermitte (il me semble qu'il intervient également sur ce forum) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part 
2
3
4
5
6
7
8
9
10
11
12
13
14
Ceci explique peut-être cela, si quelqu'un a une idée, je suis preneur.Envoyé par Luc Hermitte
D'autre part, Luc Hermitte (toujours lui), m'a également fait cette remarque :
Remarque pertinente, quoique j'aimerais en savoir un peu plus à ce sujet. De plus, s'agissant d'un code de calcul numérique assez intense, les performances sont tout de même relativement importantes, donc il serait bon que le développement en ligne ait lieu. Si des gens ont des précisions à ce sujet et pas seulement dans le cas particulier de GCC (j'essaye de faire en sorte que le code soit le plus portable possible), je lui en saurais gré.Attention aux foncteurs par référence. Le fait qu'ils soient passés par valeur n'est pas innocent à mon avis. C'est une des règles conseillée dans Effective STL de Scott Meyers. En diagonale, je lis que la SL prend par valeur pour pouvoir accepter pointeur de fonction comme foncteur sans broncher. Puis toute une discussion sur le slicing qui attend au tournant et que donc pour avoir du polymorphisme, il faut introduire une indirection à la pseudo-pimpl, vu que le type d'implémentation sera celui dérivé.
Après, je ne sais pas si cela a des impacts sur la capacité du compilo à inliner l'appel. Il faudrait faire des tests et décoder l'assembleur généré.
À bientôt.
Le Farfadet Spatial

 

 
		
		 
         
 

 
			
			

 
 
 
			 
   
 


 Fonctions virtuelles et foncteurs.
 Fonctions virtuelles et foncteurs.
				 Répondre avec citation
  Répondre avec citation



 
  
  
  
			
Partager