T'est en train de dire que faire
dst[42] = dst[24];
ou
dst[43] = dst[25];
c'est pareil là non ? Permet moi d'en douter.
Non, je suis en train de dire que l'on s'en fou que le compilo fasse : dst[42] = src[24];
psrc = psrc + 1;
pdst = pdst + 1;
où psrc = psrc + 1;
pdst = pdst + 1;
dst[42] = src[24];
Dans les deux cas cela reviens au même d'un point de vue sémantique. L'opérateur de post-incrémentation signifie que la valeur qui sera utilisée pour indexer le tableau est la valeur de la variable avant de faire l'incrémentation. Donc soit le compilateur fait l'incrémentation après l'indicage, soit il l'a fait avant et dans ce cas il doit conserver une copie de l'ancienne valeur.
Dans la pratique, pour le processeur récents, le compilateur va faire une sauvegarde des valeurs et ensuite placer les instructions pour l'affectation et les incrémentation. L'avantage c'est qu'il n'y a aucune dépendances entre l'affectation et les deux incrémentations, le compilateur peut donc faire les trois en même temps s'il à suffisamment d'unités de calculs libres à ce moment là. Et avec le renomage de registres dans le processeur c'est généralement la manière la plus efficace de coder cette opération.
La sémantique des pre/post-incrémentation en C en parfaitement claire et la seule chose à retenir dans un cas comme dans l'autre est qu'une variable pre/post-incrémentée ne doit être utilisée qu'une seule fois dans une expression.
[^] # Re: Sécurité ?
Posté par beagf . En réponse à la dépêche Un nouveau serveur httpd : Ashd, A Sane HTTP Daemon. Évalué à 3.
dst[42] = dst[24];
ou
dst[43] = dst[25];
c'est pareil là non ? Permet moi d'en douter.
Non, je suis en train de dire que l'on s'en fou que le compilo fasse :
dst[42] = src[24];psrc = psrc + 1;
pdst = pdst + 1;
où
psrc = psrc + 1;pdst = pdst + 1;
dst[42] = src[24];
Dans les deux cas cela reviens au même d'un point de vue sémantique. L'opérateur de post-incrémentation signifie que la valeur qui sera utilisée pour indexer le tableau est la valeur de la variable avant de faire l'incrémentation. Donc soit le compilateur fait l'incrémentation après l'indicage, soit il l'a fait avant et dans ce cas il doit conserver une copie de l'ancienne valeur.
Dans la pratique, pour le processeur récents, le compilateur va faire une sauvegarde des valeurs et ensuite placer les instructions pour l'affectation et les incrémentation. L'avantage c'est qu'il n'y a aucune dépendances entre l'affectation et les deux incrémentations, le compilateur peut donc faire les trois en même temps s'il à suffisamment d'unités de calculs libres à ce moment là. Et avec le renomage de registres dans le processeur c'est généralement la manière la plus efficace de coder cette opération.
La sémantique des pre/post-incrémentation en C en parfaitement claire et la seule chose à retenir dans un cas comme dans l'autre est qu'une variable pre/post-incrémentée ne doit être utilisée qu'une seule fois dans une expression.