宏偏移量的正确用法
Correct usage of offsetof macro
我正在尝试以以下方式使用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 == %pn",tfb(&map[40][50].top),tfb(&map[40][50].middle),&map[40][50]);
现在真正的问题是:
- 它安全吗?(假设使用g++)
- 它能与任何标准优化一起工作吗?(主要为
-O2
) - 有更好的方法来做我正在做的事情吗?(我需要这样做,以避免为每个
MapBlock
存储x和y,但能够在不知道相关MapTile
的情况下通过块访问它们) - 在减去偏移量时,我可以避免转换为
u8
吗?我想没有,但我只是想确定一下
感谢
实际上,我的解决方案似乎一切都很好。评论中建议的优化(使用block - 1
)也起到了作用,所以如果您有类似的问题,请随意使用我的示例!
相关文章:
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 通过指针偏移量访问结构变量值
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- librdkafka:rd_kafka_assignment 返回分配分区的偏移量 -1001
- 是否通过向封闭对象的地址添加字节偏移量来访问子对象
- 向指针地址添加 20 个字节偏移量
- glMapBufferRange(..) 中的偏移量关系和 glDrawArraysInstanced(..) 中的第一
- 是否有与 C# Structs/StructLayout 等效的功能,C++中的字段偏移量?
- 我的 sumASCII 函数中的此偏移量是多少?
- boost::序列化中的派生类偏移量计算.有效吗?
- RedisGraph 语法错误在偏移量 8 靠近"创建"
- 胎面偏移量的时间复杂度?
- 如何从 c++ 中的给定标准输入中获取每个字符的偏移量?
- 编译器在构造函数中计算的成员偏移量不正确
- 使用基地址和偏移量获取变量的地址
- c++ 读取进程内存基址 + 偏移量不起作用
- 通过其在 C 中的偏移量调用函数
- ld:无效的字符串偏移量...对于".strtab"部分
- GDB 显示损坏的指令地址偏移量
- 宏偏移量的正确用法