Outils pour utilisateurs

Outils du site


lang:c:attribut

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
lang:c:attribut [2020/07/13 14:43] – [__attribute__((const)) et __attribute__((pure))] : ajout des exemples "pure" rootlang:c:attribut [2021/01/05 21:50] (Version actuelle) – [restrict] : ajout du code source root
Ligne 1: Ligne 1:
 Les attributs ci-dessous sont non standards et dépendent du compilateur. Les attributs ci-dessous sont non standards et dépendent du compilateur.
  
-===__attribute__((const)) et __attribute__((pure))===+====__attribute__((const)) et __attribute__((pure))====
  
 Il est aussi possible d'utiliser ''%%[[gnu::pure]]%%'' et ''%%[[gnu::const]]%%''. Il est aussi possible d'utiliser ''%%[[gnu::pure]]%%'' et ''%%[[gnu::const]]%%''.
Ligne 27: Ligne 27:
 <WRAP center round important 60%> <WRAP center round important 60%>
 Rappel : l’attribut ''pure'' n'est pas ''thread-safe'' si la fonction fait appel à une variable globale ou si un de ces arguments peut être modifiée par un autre thread. Rappel : l’attribut ''pure'' n'est pas ''thread-safe'' si la fonction fait appel à une variable globale ou si un de ces arguments peut être modifiée par un autre thread.
 +
 +[[https://stackoverflow.com/questions/45190217/gcc-optimization-of-pure-functions|GCC optimization of pure functions]] {{ :lang:c:attribut:c_-_gcc_optimization_of_pure_functions_-_stack_overflow_2020-07-15_08_31_26_.html |Archive du 19/07/2017 le 15/07/2020}}
 </WRAP> </WRAP>
  
Ligne 34: Ligne 36:
  
 ^Code^Assembleur^ ^Code^Assembleur^
-|Deux appels consécutifs : optimisation. \\ \\ {{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/attribute/pure1.cpp}}|{{gh>https://github.com/bansan85/wiki_le_garrec_fr_travis/blob/master/cpp/attribute/pure1.cpp.txt 2}}| +|Deux appels consécutifs : optimisation. \\ \\ {{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/attribute/pure1.cpp}}|{{gh>https://github.com/bansan85/wiki_le_garrec_fr_travis/blob/master/cpp/attribute/pure1.cpp.asm 2}}| 
-|Modification entre deux appels : pas d'optimisation. \\ \\ {{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/attribute/pure2.cpp}}|{{gh>https://github.com/bansan85/wiki_le_garrec_fr_travis/blob/master/cpp/attribute/pure2.cpp.txt 2}}| +|Modification entre deux appels : pas d'optimisation. \\ \\ {{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/attribute/pure2.cpp}}|{{gh>https://github.com/bansan85/wiki_le_garrec_fr_travis/blob/master/cpp/attribute/pure2.cpp.asm 2}}| 
-|Utilisation intermédiaire par copie par une fonction : pas d'optimisation !!! \\ \\ {{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/attribute/pure3.cpp}}|{{gh>https://github.com/bansan85/wiki_le_garrec_fr_travis/blob/master/cpp/attribute/pure3.cpp.txt 2}}| +|Utilisation intermédiaire par copie par une fonction : pas d'optimisation !!! \\ \\ {{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/attribute/pure3.cpp}}|{{gh>https://github.com/bansan85/wiki_le_garrec_fr_travis/blob/master/cpp/attribute/pure3.cpp.asm 2}}| 
-|Utilisation intermédiaire par copie par une fonction inconnue pure : optimisation. \\ \\ {{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/attribute/pure4.cpp}}|{{gh>https://github.com/bansan85/wiki_le_garrec_fr_travis/blob/master/cpp/attribute/pure4.cpp.txt 2}}| +|Utilisation intermédiaire par copie par une fonction inconnue pure : optimisation. \\ \\ {{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/attribute/pure4.cpp}}|{{gh>https://github.com/bansan85/wiki_le_garrec_fr_travis/blob/master/cpp/attribute/pure4.cpp.asm 2}}| 
-|Utilisation en lecture au milieu : optimisation. \\ \\ {{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/attribute/pure5.cpp}}|{{gh>https://github.com/bansan85/wiki_le_garrec_fr_travis/blob/master/cpp/attribute/pure5.cpp.txt 2}}| +|Utilisation en lecture au milieu : optimisation. \\ \\ {{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/attribute/pure5.cpp}}|{{gh>https://github.com/bansan85/wiki_le_garrec_fr_travis/blob/master/cpp/attribute/pure5.cpp.asm 2}}| 
-|Utilisation en écriture au milieu : pas d'optimisation. \\ \\ {{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/attribute/pure6.cpp}}|{{gh>https://github.com/bansan85/wiki_le_garrec_fr_travis/blob/master/cpp/attribute/pure6.cpp.txt 2}}|+|Utilisation en écriture au milieu : pas d'optimisation. \\ \\ {{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/attribute/pure6.cpp}}|{{gh>https://github.com/bansan85/wiki_le_garrec_fr_travis/blob/master/cpp/attribute/pure6.cpp.asm 2}}|
  
  
-===__attribute__((weak))===+====__attribute__((weak)) et extern==== 
 + 
 +  * Explication 
 Cette information va être utile au lieur. Cette information va être utile au lieur.
  
-Chaque symbole (variable globale ou fonction) peut être "strong" ou ''weak''. Si un symbole "strong" existe, les symboles ''weak'' seront ignorés. Si deux symboles ''weak'' existent sans symbole "strong", le lieur prendra aléatoirement l'un des deux. Si deux symboles "strong" existent, le lieur va générer une erreur ''duplicate symbol''.+Chaque symbole (variable globale ou fonction) peut être "strong" ou ''weak''. Si un symbole "strong" existe, les symboles ''weak'' seront ignorés. Si deux symboles ''weak'' existent sans symbole "strong", le lieur prendra aléatoirement l'un des deux (voir [[lang:cpp:lieur#les_methodes_definies_dans_un_entete_ont_un_attribut_weak|lieur]]). Si deux symboles "strong" existent, le lieur va générer une erreur ''duplicate symbol''.
  
-Il est aussi possible de définir un prototype ou la déclaration d'une variable globale ''extern'' en ''weak''. Dans ce cas, si le symbole n'est pas défini, le lieur ne posera pas de problème (pas de ''undefined reference to'') et considérera que le symbole est à l'adresse ''null'' (attention aux pointeurs null).+Il est aussi possible de définir un prototype ou la déclaration d'une variable globale ''extern'' en ''weak''. Dans ce cas, si le symbole n'est pas défini, le lieur ne posera pas de problème (pas de ''undefined reference to'') et considérera que le symbole est à l'adresse ''null'' (ne pas lire ces symboles).
  
-<code c> +  * Exemple
-#include <iostream>+
  
-// Défini dans le header +{{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/attribute/weak1.cpp}}
-extern int __attribute__((weak)) variable; +
-extern unsigned char __attribute__((weak)) variableNull;+
  
-// Défini dans le code source. +Symboles :
-int __attribute__((weak)) variable = 1;+
  
-int main() +{{gh>https://github.com/bansan85/wiki_le_garrec_fr_travis/blob/master/cpp/attribute/weak1.cpp.nm}}
-{ +
-  // variable a bien un pointeur non nullptr. +
-  std::cout << reinterpret_cast<size_t>(&variable) << " vaut " << variable << "\n"; +
-  // variableNull est bien une variable avec un pointeur nullptr. +
-  std::cout << reinterpret_cast<size_t>(&variableNull) << " est nullptr.\n"; +
-} +
-</code>+
  
 Résultat dans la sortie standard: Résultat dans la sortie standard:
  
-<code+{{gh>https://github.com/bansan85/wiki_le_garrec_fr_travis/blob/master/cpp/attribute/weak1.out}} 
-6295640 vaut 1 + 
-est nullptr+====restrict==== 
-</code>+ 
 +Mot clé pour indiquer qu'une zone mémoire n'est accédée que par un seul pointeur. Cette restriction n'est évidemment pas thread-safe
 + 
 +Voir l'exemple de Wikipédia sur [[https://fr.m.wikipedia.org/wiki/Restrict|restrict]] {{ :lang:c:attribut:restrict_wikipedia_04_01_2021_20_34_41_.html |Archive du 16/04/2020 le 04/01/2021}}. 
 + 
 +^Source^Code généré^ 
 +|{{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/attribute/restrict1.c 2}}|{{gh>https://github.com/bansan85/wiki_le_garrec_fr_travis/blob/master/cpp/attribute/restrict1.c.asm 3}}| 
 +|{{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/attribute/restrict2.c 3}}|{{gh>https://github.com/bansan85/wiki_le_garrec_fr_travis/blob/master/cpp/attribute/restrict2.c.asm 3}}| 
 + 
 +Avec ''restrict'', il n'y a pas besoin de relire le contenu de ''*val'' entre les deux instructions.
lang/c/attribut.1594644220.txt.gz · Dernière modification : 2020/07/13 14:43 de root