gpt4 book ai didi

c++ - 正确使用 offsetof 宏

转载 作者:太空宇宙 更新时间:2023-11-04 04:55:06 26 4
gpt4 key购买 nike

我正在尝试以下列方式使用 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)
  • 有没有更好的方法来完成我正在做的事情? (我需要这样做以避免为每个 MapBlock 存储 xy 但能够在不知道相关 的情况下通过 block 访问它们MapTile)
  • 我可以在减去偏移量时避免转换为 u8 吗?我想没有,但我只是想确定一下..

谢谢

最佳答案

实际上,一切似乎都与我的解决方案相得益彰。评论中建议的优化(使用 block - 1)也确实有效,所以如果您遇到类似问题,请随时使用我的示例!

关于c++ - 正确使用 offsetof 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9548130/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com