2 votes

Puis-je utiliser __builtin_*_overflow comme += ou *= ?

Est-il légal d'utiliser une seule variable à la fois pour la source et la destination de GCC ? __builtin_*_overflow fonctions ?

Par exemple, étant donné

int a, b;

Je voudrais écrire un chèque a += b como

__builtin_add_overflow(a, b, &a)

Est-ce sûr ?

1voto

Grzegorz Szpetkowski Points 10225

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X