Je pense qu'il est raisonnable de supposer, que __builtin_add_overflow(a, b, &a)
fonctionnera comme a += b
.
Notez qu'il peut aussi être invoqué avec des constantes :
__builtin_add_overflow(10, 5, &a)
Normalement, GCC la traitera comme une fonction intrinsèque, ce qui signifie que son appel est remplacé en interne par le compilateur avec le code généré. Elle n'est pas traitée comme une fonction normale (au sens du C), puisqu'il n'y a pas de fichier d'en-tête avec sa déclaration. Par conséquent, ce n'est ni une fonction en ligne ni une macro de type fonction.
6.54 Fonctions intégrées pour effectuer des opérations arithmétiques avec contrôle de débordement
Le compilateur essaiera d'utiliser des instructions matérielles pour implémenter ces fonctions intégrées, comme le saut conditionnel en cas de débordement après l'addition, le saut conditionnel sur la retenue, etc.
Voici un exemple (le meilleur est fourni dans le document commentaire ci-dessous) :
#include <stdio.h>
int main(void)
{
int a = 10;
int b = 5;
__builtin_add_overflow(a, b, &a);
printf("%d\n", a);
}
qui se traduit sur GCC 6.3.0 avec -O0 en (voir godbolt.org/g/UJqenc ) :
mov DWORD PTR [rbp-8], 10 ; place a and b on stack
mov DWORD PTR [rbp-4], 5
mov edx, DWORD PTR [rbp-8] ; copy a and b into GP registers
mov eax, DWORD PTR [rbp-4]
add eax, edx
mov DWORD PTR [rbp-8], eax ; move the sum into a
mov eax, DWORD PTR [rbp-8]
mov esi, eax ; pass a into printf
mov edi, OFFSET FLAT:.LC0
mov eax, 0
call printf