微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

这种对offsetof的使用是否保证正确?

如何解决这种对offsetof的使用是否保证正确?

我已阅读到offsetof宏通常实现为:

tf.scan(lambda a,x: a +" " + x,elems)
<tf.Tensor: shape=(6,),dtype=string,numpy=
    ([b'hello',b'hello my',b'hello my name',b'hello my name is',b'hello my name is inigo',b'hello my name is inigo montoya'],dtype=object)>

根据Wikipedia的说法,这是否是未定义的行为引起了争论,因为它可能正在取消引用指针。我有一个需要发送到不同位置的信息缓冲区,但是该缓冲区仅占用了部分结构。我想知道是否可以保证以下内容能将结构的正确大小提供到缓冲区的末尾,即最后一个成员。

#define offsetof(st,m) \
    ((size_t)&(((st *)0)->m))

}

如果使用offsetof不是一个好主意,那么做我想做的最好的方法是什么?

编辑:sizeof(PerObjBuffer)-sizeof(String)怎么样?我是否需要考虑填充问题?

解决方法

该标准指定事物的行为,而不是行为的实现方式。实施部分留给实施者-编写编译器和库的人员-他们必须以标准指定的工作方式实现事物。如果标准库的实现本身没有定义的行为是无关紧要的-它必须与指定的编译器一起使用,因此特定的编译器将以实现者想要的行为的方式来解释它。未定义的行为表示标准对代码的行为没有要求。您的编译器文档可能会指定其他要求,这些要求指定未定义根据标准的代码的行为-因此,该代码可能未由标准定义,并且在需要/编写的特定编译器上完全正确且合理用这种方式解释它。

使用正确的#include时,C ++语言使用C语言中的宏。 C标准说C99 7.17p3

 The macros are [...] and

        offsetof(type,member-designator)

which expands to an integer constant expression that has type size_t,the value of which is the offset in bytes,to the structure member (designated by member-designator),from the beginning of its structure (designated by type). The type and member designator shall be such that given

        static type t;

then the expression &(t.member-designator) evaluates to an address constant. (If the specified member is a bit-field,the behavior is undefined.)

作为该语言的用户,您不在乎该语言的实现方式。如果使用兼容标准的编译器,则无论其在后台执行什么操作,都应导致该标准指定的行为。您对offsetof(PerObjBuffer,sampleType)的使用是有效的-先让static PerObjBuffer t;然后&(t.member-sampleType)求值以寻址常量-因此offsetof(PerObjBuffer,sampleType)求值为整数常量表达式。您喜欢不在乎编译器如何得出结果-它可以使用暗魔术来完成-编译器执行结果和结果表示以字节为单位的偏移量很重要。 (我认为著名的例子是memcpy-无法以符合标准的方式实现memcpy,但是功能...存在。)

仍然,我担心您代码的其他部分将非常无效。 memcpy很可能会导致未定义的行为-您将在成员之间复制填充,并且您似乎想将填充发送到某个硬件位置。无论如何,我建议对C ++对象的寿命和表示形式,结构内的填充,对象的类型(即POD /标准布局/琐碎)以及如何使用它们进行广泛的研究。可以使用mem*函数/新位置/ std::launder)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。