構造体のアラインメントについては過去に質問したので、今回は別の話です。
4バイト整数または4バイト浮動小数をメモリに格納する場合, 先頭アドレスが4の倍数になるようにすれば上図の1ワードに収まるため, 1回のメモリアクセスで読み書きできる. このようにデータの先頭アドレスを4の倍数にすることを, 「4バイト境界にアライン (align:整列,位置合わせ) する」という.
64bitシステムだと8Bなので、8の倍数にすれば美しくなるんですかね。
char buf[a]; // aが8の倍数
ところがアセンブリ言語を見ると64bitでもスタックは32bitです。
つまり64bitでもアラインメントは4の倍数にしなくてはダメという事ですよね?
このサイトの説明が変なのでしょうか?
8B? 4B?
私の本の中にこう書いてあります。
malloc() calloc() realloc()により割り当てたメモリについては、C言語すべての標準の型を正しくアラインメントするようにPOSIXでも定義されています。Linuxでも上記ライブラリ関数は、32bitシステムは8バイト境界に、64bitシステムでは16バイトにアラインメントします。
ヒープ領域はスタックとは別物なのでアラインメントも異なるという事ですかね。
各領域ごとにアライメントが決められているんでしょうか??
1回のメモリアクセスで読み書きできる. このようにデータの先頭アドレスを4の倍数にすること
この説明では全く分かりません。
CPUによって固定ならどんな領域でも64bitなら8Bにしなくてはならないはずです。
さらに謎な点が・・・
アライメントはそのシステムのアーキテクチャによって固定ですよね?
#define _XOPEN_SOURCE 600 #define GNU_SOURCE #include<stdlib.h> int posix_memalign(void **memptr, size_t alignment, size_t size);
任意のサイズでアラインメントを可能にする関数ですが、任意のアライメントってどういうことですか??
Linux 64bit x86_64です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/26 11:54
2017/09/26 13:24 編集
2017/09/26 13:36
2017/09/26 13:46 編集
2017/09/26 13:56
2017/09/26 14:01
2017/09/26 14:06 編集
2017/09/26 14:41
2017/09/26 14:45
2017/09/26 15:27
2017/09/26 15:42
2017/09/28 04:15