Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Inline sans effet

4 réponses
Avatar
Sivaller
Voici un mini projet avec la directive inline SANS EFFET.

Il est sans effet en mode Debug , ok il s'agit d'un mode de debuggage,
il est aussi sans effet quand je le compile en mode release sachant que la
fonction se trouve
dans un autre fichier .cpp

Comment faut t'il faire pour que la directive __inline aie son effet sans
avoir à déplacer
la fonction en question sur le même fichier .cpp ?

Ouvrir ce mini-projet et tester avec F5 en mode release

Merci ;
http://sivallerstatic.no-ip.org/teste.zip

4 réponses

Avatar
Stephane Wirtel
Voici un mini projet avec la directive inline SANS EFFET.

Il est sans effet en mode Debug , ok il s'agit d'un mode de debuggage,
il est aussi sans effet quand je le compile en mode release sachant que la
fonction se trouve
dans un autre fichier .cpp

Comment faut t'il faire pour que la directive __inline aie son effet sans
avoir à déplacer
la fonction en question sur le même fichier .cpp ?

Ouvrir ce mini-projet et tester avec F5 en mode release

Merci ;
http://sivallerstatic.no-ip.org/teste.zip


1) Quel compilateur ?

2) Quel OS ?
3) Quel IDE ?
4) Quel rapport avec le C++ standard ?

Avatar
Pierre Maurette
Voici un mini projet avec la directive inline SANS EFFET.

Il est sans effet en mode Debug , ok il s'agit d'un mode de debuggage,
il est aussi sans effet quand je le compile en mode release sachant que la
fonction se trouve
dans un autre fichier .cpp

Comment faut t'il faire pour que la directive __inline aie son effet sans
avoir à déplacer
la fonction en question sur le même fichier .cpp ?

Ouvrir ce mini-projet et tester avec F5 en mode release

Merci ;
http://sivallerstatic.no-ip.org/teste.zip


Tout d'abord, pour tester votre sortie asm en release, vous avez la
famille de commutateurs /FA.., par exemple /FAcs. Sous VS .NET 2003,
c'est dans les propriétés du projet, onglet C/C++ - "Fichiers de
sortie". Vous évitez ainsi le _asm int 3, ce qui n'est peut-être pas
innocent. En effet, certains compilateurs (mais sans doute pas VC7.0)
n'optimisent plus quand ils tombent sur un bloc asm, refuasant d'en
analyser le contenu.

Si vous mettez la fonction dans le bloc du main(), ça va effectivement
inliner. Mais comme VC n'est pas idiot, il va remplacer mil(8, 2) par
(long)160 et vous ne verrez pas grand'chose. Vous pouvez voir ce qui se
passe avec:

volatile long a;
volatile unsigned short m = 8;
volatile unsigned short n = 2;
...
a=mil(m,n);

Et vous aurez:

; 19 : a=mil(m,n);

0001c 8b 4c 24 04 mov ecx, DWORD PTR _n$[esp+12]
00020 0f b7 44 24 08 movzx eax, WORD PTR _m$[esp+12]
00025 0f b7 c9 movzx ecx, cx
00028 8d 14 01 lea edx, DWORD PTR [ecx+eax]
0002b 0f af d1 imul edx, ecx
0002e 0f af d0 imul edx, eax
00031 89 54 24 08 mov DWORD PTR _a$[esp+12], edx

; 20 : printf("%dn",a);

00035 8b 44 24 08 mov eax, DWORD PTR _a$[esp+12]
00039 50 push eax
0003a 68 00 00 00 00 push OFFSET FLAT:??@?$CFd?6?$AA@
0003f e8 00 00 00 00 call _printf


ce qui est déjà plus visuel.

Regardez ce que dit la doc sur inline, __inline et surtout
__forceinline.

--
Pierre

Avatar
Pierre Maurette
Voici un mini projet avec la directive inline SANS EFFET.

Il est sans effet en mode Debug , ok il s'agit d'un mode de debuggage,
il est aussi sans effet quand je le compile en mode release sachant que la
fonction se trouve
dans un autre fichier .cpp

Comment faut t'il faire pour que la directive __inline aie son effet sans
avoir à déplacer
la fonction en question sur le même fichier .cpp ?

Ouvrir ce mini-projet et tester avec F5 en mode release

Merci ;
http://sivallerstatic.no-ip.org/teste.zip


1) Quel compilateur ?

2) Quel OS ?
3) Quel IDE ?
Tout est là : http://sivallerstatic.no-ip.org/teste.zip



4) Quel rapport avec le C++ standard ?
ISO/IEC 14882:1998(E) §7.1.2.1 et suivants ...


--
Pierre


Avatar
Pierre Maurette
(supersedes )

Voici un mini projet avec la directive inline SANS EFFET.

Il est sans effet en mode Debug , ok il s'agit d'un mode de debuggage,
il est aussi sans effet quand je le compile en mode release sachant que la
fonction se trouve
dans un autre fichier .cpp

Comment faut t'il faire pour que la directive __inline aie son effet sans
avoir à déplacer
la fonction en question sur le même fichier .cpp ?

Ouvrir ce mini-projet et tester avec F5 en mode release

Merci ;
http://sivallerstatic.no-ip.org/teste.zip


Tout d'abord, pour tester votre sortie asm en release, vous avez la
famille de commutateurs /FA.., par exemple /FAcs. Sous VS .NET 2003,
c'est dans les propriétés du projet, onglet C/C++ - "Fichiers de
sortie". Vous évitez ainsi le _asm int 3, ce qui n'est peut-être pas
innocent. En effet, certains compilateurs (mais sans doute pas VC7.0)
n'optimisent plus quand ils tombent sur un bloc asm, refuasant d'en
analyser le contenu.

Si vous mettez la fonction dans la même unité que main(), ça va
effectivement inliner. Mais comme VC n'est pas idiot, il va remplacer
mil(8, 2) par (long)160 et vous ne verrez pas grand'chose. Vous pouvez
voir ce qui se passe avec:

volatile long a;
volatile unsigned short m = 8;
volatile unsigned short n = 2;
...
a=mil(m,n);

Et vous aurez:

; 19 : a=mil(m,n);

0001c 8b 4c 24 04 mov ecx, DWORD PTR _n$[esp+12]
00020 0f b7 44 24 08 movzx eax, WORD PTR _m$[esp+12]
00025 0f b7 c9 movzx ecx, cx
00028 8d 14 01 lea edx, DWORD PTR [ecx+eax]
0002b 0f af d1 imul edx, ecx
0002e 0f af d0 imul edx, eax
00031 89 54 24 08 mov DWORD PTR _a$[esp+12], edx

; 20 : printf("%dn",a);

00035 8b 44 24 08 mov eax, DWORD PTR _a$[esp+12]
00039 50 push eax
0003a 68 00 00 00 00 push OFFSET FLAT:??@?$CFd?6?$AA@
0003f e8 00 00 00 00 call _printf


ce qui est déjà plus visuel.

Regardez ce que dit la doc sur inline, __inline et surtout
__forceinline.

--
Pierre