(そういえば、以前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