(そういえば、以前FFIをサポートした際に問題になるかも的なことを書いたような・・・)
以下のコードが予想と違う。
#include <stddef.h>
#include <stdio.h>
struct align_struct
{
  int value1;
  struct {
    int value2;
    char *str;
  } inner;
};
int main (int argc, char **argv)
{
  printf("offsetof: %d\n", offsetof(struct align_struct, inner));
  return 0;
}
結果が、32bitのCygwin(多分32bitならどれでも同じ、と信じる)では、4。これは期待通り。で、X86_64では8。これが8になられると大問題で、なぜかといえば、以下のコードはどちらの環境でも4を返すから。 
#include <stddef.h>
#include <stdio.h>
struct align_struct
{
  char c;
  int  x;
};
int main (int argc, char **argv)
{
  printf("offsetof: %d\n", offsetof(struct align_struct, x));
  return 0;
}
何か勘違いしているのかもしれないのだが、FFIのサポートにlibffiを使っていて、アライメントの計算はそこにどっぷり依存している。中身を展開してやったら期待通りの値になった。構造体のアライメントが変わってくるのかなぁ?単にフラットにしてくれれば問題ないのに。libffiをもう一回見直すか・・・
 
 
No comments:
Post a Comment