1

私はoffsetof次のようにマクロを操作しようとしています。

typedef unsigned char u8;
typedef unsigned short u16;

struct MapBlock
{
  u16 type : 10;
  u8 variant : 3;
  bool isTop : 1;
};

struct MapTile
{
  struct MapBlock top, middle;
  u16 x;
  u8 y;
};

MapTile *tfb(struct MapBlock *block)
{
  if (block->isTop)
    return (MapTile*)block;
  else
    return (MapTile*)((u8*)block - offsetof(struct MapTile, middle));
}

そしてそれはこの単純なテストケースで動作するようです:

for (int i = 0; i < width; ++i)
  for (int j = 0; j < height; ++j)
  {
    map[i][j].x = i;
    map[i][j].y = j;
    map[i][j].top.isTop = true;
    map[i][j].middle.isTop = false;
  }

printf("%p == %p == %p\n",tfb(&map[40][50].top),tfb(&map[40][50].middle),&map[40][50]);

今本当の質問:

  • 安全ですか?( g ++で動作すると仮定)
  • 標準の最適化で機能しますか?(主に-O2
  • 私がしていることをするためのより良い方法はありますか?(すべてのxyを保存しないようにする必要がありますMapBlockが、関連することを知らなくてもブロックを介してそれらにアクセスできますMapTile
  • u8オフセットを引くときにキャストを回避できますか?いいえと思いますが、確認したかっただけです。

ありがとう

4

1 に答える 1

0

実際、私のソリューションではすべてがうまく機能しているように見えました。コメント(を使用)で提案された最適化block - 1も機能したので、同様の問題がある場合は、私の例を自由に使用してください!

于 2012-03-15T00:08:56.987 に答える