问题标签 [offsetof]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
121 浏览

gcc - gcc插件实现offsetof

我正在编写一个用于解析结构字段的 gcc 插件。但是我有问题如何获取结构中每个字段的偏移量?就像 gcc 中的 offsetof 宏一样。

DECL_FIELD_OFFSET在 tree.h 中看到,但结果似乎不对。

我的代码来自 Richard WM Jones,https://rwmj.wordpress.com/2016/02/24/playing-with-gcc-plugins/

测试源文件是:

但是偏移量

不是正确的结果:

0 投票
0 回答
67 浏览

c++ - offsetof:寻求官方用语的澄清

参考offsetof

希望对以下内容进行更简单的解释:

表达式offsetof(type, member)从不依赖类型,当且仅当类型依赖时,它才依赖于值。

0 投票
3 回答
1044 浏览

c++ - c++ reinterpret_cast 一个整数

我遇到了以下c ++代码:

其中 t 是类型,f 是字段名称。我想知道为什么我们可以将整数 16 作为 reinterpret_cast 的参数。

0 投票
1 回答
137 浏览

c++ - offsetof 是否需要指针取消引用?

我想知道一个简单的宏是否offset_of_需要指针取消引用。例如,一个C++(意味着此代码将使用 C++ 编译器编译)结构体,它使用打包属性声明

假设sizeof(int) == 4在这种情况下,为了计算yinside的偏移量A,我编写了一个简单的宏:

我们能确定这个宏的值总是4吗?调用宏时是否有任何指针取消引用0(可能是 UB)?

非常感谢您的任何回复。

0 投票
1 回答
69 浏览

c++ - 如何查找结构字段占用的空间以及它与下一个字段之间的填充?

因此,如果我有这样的结构:

我想获取 Msg::Hdr 的大小,包括在下一个字段 Msg::Payload 之前的任何填充。

我想要这个,因为我正在使用 QNX Neutrino 操作系统的嵌入式系统中工作。操作系统是一个微内核消息传递操作系统。一种常见的技术是设计所有消息,其中包含一个简短的标头,其中包含我的库代码的用户不需要知道的特殊信息,以及一个有效负载(用户关心的部分)。在这种情况下,QNX IOV 工具可以通过减少复制来极大地提高性能。他们的 API 是这样工作的:

然而,我发现:

我该怎么做呢?我见过一些棘手的东西,但不确定最合适的方法。我怀疑答案将涉及以下组合:sizeof、alignof 或宏 offsetof。

带有 IOV 的 QNX 多部分消息 http://www.qnx.com/developers/docs/6.6.0.update/#com.qnx.doc.neutrino.getting_started/topic/s1_msg_Multipart_messages.html

0 投票
0 回答
178 浏览

c++ - 通过父类和偏移量访问成员变量

我放了标签language lawyer,虽然我觉得这是在标准边界的错误一侧。我还没有看到关于这一点的对话,但我在工作中,所以我想对此有一些确定性。

问题是访问(可能)虚拟基类的私有字段。假设我计算了一个类的私有字段的偏移量,然后在类外部使用这个偏移量来访问(读/写)这个位置的成员变量。

我看到有一个GCC和clang的扩展offsetof(这个是在C++17中条件定义的,是什么意思?),使用它就相当于一些指针算术是这样的:

我还做了一个不抱怨的大肠杆菌(迂腐),但仍然...... https://coliru.stacked-crooked.com/a/faecd0b248eff651

标准中是否有授权这一点的东西,或者这是在未定义的行为领域?很高兴看到标准之间是否存在差异。

0 投票
1 回答
744 浏览

c++ - 在标准布局对象(例如,使用 offsetof)中进行指针运算时,我们是否需要使用 std::launder?

这个问题是对以下问题的跟进:当它实际上并不指向 char 数组时,是否添加到“char *”指针 UB?

CWG 1314中,CWG 确认使用指针在标准布局对象内执行指针运算是合法的unsigned char。这似乎意味着类似于链接问题中的一些代码应该按预期工作:

(为了更清楚,我已替换char为。)unsigned char

但是,似乎 C++17 中的新更改意味着该代码现在是 UB,除非std::launder在两个reinterpret_casts. reinterpret_cast两个指针类型之间的 a 的结果等价于两个static_casts:第一个指向cv void*,第二个指向目标指针类型。但是 [expr.static.cast]/13 暗示这会产生一个指向原始对象的指针,而不是指向目标类型对象的指针,因为类型Foo的对象在其第一个字节处不能与对象进行指针互转换unsigned char,也不是指针unsigned char的第一个字节处的对象与自身可相互转换。f.zf.z

我很难相信委员会打算做出改变来打破这个非常常见的习惯用法,使所有 C++17 之前的使用都offsetof未定义。

0 投票
2 回答
325 浏览

c - 这个 offsetof 的实现会调用未定义的行为吗?

offsetof定义如下stddef.h

由于取消引用 NULL 指针,这是否会调用未定义的行为?如果不是,为什么?

0 投票
0 回答
84 浏览

ebpf - 使用在 prog_kern.c ebpf

我已经看到,ebpf 程序不是使用#include <stddef.h>来访问offsetof宏,而是有条件地在prog_kern.c文件中定义宏。包含 stddef.h 是错误的prog_kern.c吗?如果是,我为什么要避免它?

0 投票
1 回答
1468 浏览

c++ - 是否可以通过指向不同的、不相关的子对象的指针来获取指向一个子对象的指针?

看看这个简单的代码:

我希望,它main的返回值可以优化为return 2;,因为something无法访问p.y,它只能获得一个指向p.x.

main但是,没有一个主要编译器优化to的返回值2神箭

如果我们只授予访问权限,标准中是否有允许something修改的内容?如果是,这是否取决于是否有标准布局?p.yp.xPoint

如果我使用something(&p.y);, 而return p.x;不是呢?