{"id":371,"date":"2009-02-03T22:38:59","date_gmt":"2009-02-03T20:38:59","guid":{"rendered":"http:\/\/linux.leunen.com\/?p=371"},"modified":"2009-02-03T22:38:59","modified_gmt":"2009-02-03T20:38:59","slug":"c-alignement-des-structures","status":"publish","type":"post","link":"https:\/\/www.leunen.com\/linux\/2009\/02\/c-alignement-des-structures\/","title":{"rendered":"C++ &#8211; Alignement des structures"},"content":{"rendered":"<p>Vous devez toujours garder \u00e0 l&rsquo;esprit cette notion d&rsquo;alignement parce que la taille r\u00e9elle d&rsquo;une structure ou d&rsquo;une classe n&rsquo;est pas toujours celle que vous imaginez.<br \/>\nPrenons l&rsquo;exemple de cette structure:<\/p>\n<pre class=\"codesource\">\r\n<span class=\"reservedname\">struct<\/span> A\r\n{\r\n  <span class=\"reservedname\">int<\/span> i;\r\n  <span class=\"reservedname\">char<\/span> c;\r\n}a;\r\n<\/pre>\n<p>Le r\u00e9sultat de <em>sizeof(a)<\/em> donnera 8 octets alors que seulement 5 octets sont utilis\u00e9s. Le reste, c&rsquo;est l&rsquo;alignement (padding en anglais). Le compilateur essaie toujours de garder l&rsquo;alignement sur un multiple de <em>quad-word<\/em> (quatre mots, un mot \u00e9tant \u00e9gal \u00e0 deux octets). Ceci est en tout cas valable pour les PC avec un OS 32 bits et d\u00e9pend de l&rsquo;impl\u00e9mentation.<\/p>\n<pre class=\"codesource\">\r\n<span class=\"reservedname\">struct<\/span> A\r\n{\r\n  <span class=\"reservedname\">int<\/span> i;\r\n  <span class=\"reservedname\">char<\/span> c1;\r\n  <span class=\"reservedname\">char<\/span> c2;\r\n  <span class=\"reservedname\">char<\/span> c3;\r\n  <span class=\"reservedname\">char<\/span> c4;\r\n}a;\r\n<\/pre>\n<p>Dans ce cas, la r\u00e9ponse de <em>sizeof(a)<\/em> est aussi 8 octets et nous avons effectivement 8 octets d&rsquo;utilis\u00e9s. <\/p>\n<p>Il est possible, lorsque la structure des donn\u00e9es doit imp\u00e9rativement \u00eatre align\u00e9e sur sa valeur r\u00e9elle ou sur une autre valeur que des multiples de quatre mots, de dire au compilateur de changer ce comportement par d\u00e9faut. Mais il est important de savoir que si le compilateur utilise ce type d&rsquo;alignement sur des mots de quatre mots (8 octets), c&rsquo;est parce que le processeur a plus de facilit\u00e9 \u00e0 traiter cette taille de donn\u00e9es. Le processeur dispose de registres et d&rsquo;instructions rapides pour traiter les donn\u00e9es align\u00e9es de cette fa\u00e7on. Si vous modifiez l&rsquo;alignement, ceci aura un impact non-n\u00e9gligeable sur les performances de votre application. Autrement dit celle-ci sera notablement plus lente si vous traitez un grand nombre de structures de donn\u00e9es.<\/p>\n<pre class=\"codesource\">\r\n<span class=\"reservedname\">struct<\/span> A\r\n{\r\n    <span class=\"reservedname\">int<\/span> i;\r\n    <span class=\"reservedname\">char<\/span> c1;\r\n}<span class=\"reservedname\">__attribute__<\/span>((<span class=\"reservedname\">packed<\/span>));\r\n<\/pre>\n<p>L&rsquo;attribut <em>packed<\/em> donn\u00e9 \u00e0 la structure donne injonction au compilateur d&rsquo;aligner la structure sur sa taille r\u00e9elle. Ici, la r\u00e9ponse de <em>sizeof(a)<\/em> donnerait 5 octets.<\/p>\n<pre class=\"codesource\">\r\n<span class=\"reservedname\">struct<\/span> A\r\n{\r\n    <span class=\"reservedname\">int<\/span> i;\r\n    <span class=\"reservedname\">char<\/span> c1;\r\n}<span class=\"reservedname\">__attribute__<\/span>((<span class=\"reservedname\">aligned<\/span>(x)));\r\n<\/pre>\n<p>Remplacez <em>x<\/em> par la valeur que vous souhaitez et le compilateur alignera la structure sur la valeur que vous avez sp\u00e9cifi\u00e9e.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vous devez toujours garder \u00e0 l&rsquo;esprit cette notion d&rsquo;alignement parce que la taille r\u00e9elle d&rsquo;une structure ou d&rsquo;une classe n&rsquo;est pas toujours celle que vous imaginez. Prenons l&rsquo;exemple de cette structure: struct A { int i; char c; }a; Le r\u00e9sultat de sizeof(a) donnera 8 octets alors que seulement 5 octets sont utilis\u00e9s. Le reste, [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/371"}],"collection":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/comments?post=371"}],"version-history":[{"count":8,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/371\/revisions"}],"predecessor-version":[{"id":379,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/371\/revisions\/379"}],"wp:attachment":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/media?parent=371"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/categories?post=371"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/tags?post=371"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}