问题标签 [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 投票
2 回答
638 浏览

c - 使用指针和 offsetof() 访问结构的正确方法是什么

我有以下代码,以便能够访问结构数组中的众多字段(为简单起见,我将其减少为两个)。最终指针计算的正确咒语是什么, *(ptr + offset) = data; 因为我总是得到:

错误:从类型 'int32_t' {aka 'int'} 分配给类型 'struct osc_in_data' 时类型不兼容

0 投票
2 回答
231 浏览

c++ - 将字段的偏移量作为模板参数传递给该字段

我想要做的是让一个类知道它在封闭类中的偏移量,而根本没有运行时开销。这是我希望我能做的一个例子:

上面的代码无法编译,因为offsetof(Outer, ptr)不知道ptr(它正在帮助定义它)。我已经实现了相同想法的几个版本,它们确实会产生运行时开销(在内存和执行指令中),但是我在实现“0 运行时开销”版本时遇到了麻烦,就像我上面的梦想实现一样。任何想法如何做到这一点?

0 投票
3 回答
65 浏览

c++ - 引用嵌套成员的安全方法

我有一个struct和其他一些structs 作为成员。外部和内部结构都是StandardLayout(甚至可以假设内部是普通的旧数据)。像这样的东西:

我想编写一些函数,该函数采用Outer&某种类型的对象T,可以返回任何嵌套字段的值,具体取决于参数:

如果Outer是一个平面结构,指向成员的指针正是我所需要的,但它不是平面的。

最简单的方法是对所有字段进行Taenum并编写 a switch,但它效率不高。更快的方法是进行T偏移并写入

然后像get(o, offsetof(Outer, y) + offsetof(Inner2, c)). 它可以工作,但我不确定它是否可以保证工作 - 对这样的偏移量求和是否正确,以及通过偏移量获取成员值是否安全。

那么问题来了:这种方式安全吗?如果没有,有没有安全的方法?构造的值T可以是任意复杂的,但是使用它们应该很快。

动机:我需要以某种顺序放置一些嵌套字段中的值,在启动时已知,但在编译时不知道。我想T在启动时创建一个数组,然后在获取特定对象时使用这个预先计算的数组。

[UPD]:所以它会这样使用:

0 投票
1 回答
127 浏览

c - 使用 memcpy 和 offsetof 复制结构的一部分

offsetof我想通过组合宏和来复制从某个元素开始的结构的一部分memcpy,如下所示:

我希望这会输出4 2 3,但它实际上输出4 5 6就好像没有发生复制一样。我做错了什么?

0 投票
1 回答
75 浏览

c++ - 使用 offsetof 是否保证正确?

我读过 offsetof 宏通常实现为:

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

}

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

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

0 投票
1 回答
162 浏览

c++ - C++:如何让编译器优化内存访问,以防成员变量的指针被传递到别处

[编辑:这是动机:将变量的指针传递给外部函数可能会意外地破坏对“相邻”变量的一些优化,因为有可能获得指向由外部函数从原始指针计算的相邻变量的指针。以下为原帖,volatile是为了模拟当前编译单元无法访问的外部函数,例如虚函数调用、闭源库函数等]

我想知道return t.a;以下代码中的是否会优化为return 0;.

好吧,它不是。很公平,因为函数中的代码f可以offsetof用来获取指向t然后 change的指针t.a。所以优化off的负载是不安全的t.a

[编辑:再想一想,offsetof这里还不够。我们需要container_of,似乎没有办法在标准 C++ 中实现。]

offsetof不能用于非标准布局类型。所以我尝试了以下代码:

不幸的是,它仍然无法正常工作。

我的问题是:

  • t.a在上述情况下优化 away 的负载是否安全(修订版 2)
  • 如果不是,是否存在一些安排/建议使其成为可能?(例如,制作T更特殊的类型,或为成员bin制作一些属性说明符T

PS 下面的代码针对 进行了优化return t.a;,但是生成的循环代码效率有点低。而且,临时变量杂耍很麻烦。

0 投票
0 回答
50 浏览

arrays - 从C中的成员值查找结构数组中的结构

我正在尝试创建一个函数,它可以让我查看一个结构数组,并返回某个成员的值与输入匹配的那个。我找到了另一个线程,其中一个人有一个熟悉的问题,但它似乎对我不起作用。另一个线程可以在这里找到:Get a struct based on member values

我有结构:

我做了一个数组:

我使用这个功能:

它应该指向数组 VN100_registers 中的结构,其中成员值与函数输入匹配。

我初始化变量:

并调用函数:

我应该指向数组的第三个结构,但是当我调试时,我得到了这个:

调试视图

0 投票
1 回答
60 浏览

c++ - 容器中不同对象的成员之间的指针差异是否相同?

当用于标准布局类型时,c++ 宏offsetof只是定义的行为。据我了解,这是因为编译器可以根据其运行的代码的上下文更改数据的内存布局。(例如,当一个变量从不使用时)

但是,我想知道存储在一个范围中的所有元素是否共享相同的布局。或者,换句话说,如果以下代码定义明确:

0 投票
1 回答
113 浏览

c - 是否可以检测到 C 结构有一个字段?

如果结构有成员,我需要在编译时通过宏检测。我已经尝试过offsetof(struct object, a_field),但它会导致在编译时发出关于不存在字段的错误。是否有其他方法可以检查 C 结构是否有字段?

我需要这个作为宏

这样我也可以在非虚拟方法上使用它,例如:

因此,通常要检测是否存在method成员,如果有,则将其称为 asobj->member(obj, …)和 as member(obj, …)else。

0 投票
1 回答
63 浏览

c++ - 结构成员的布尔表达式求值器

背景

我有一个结构:

布尔表达式(存储在字符串中):

我有一个事件对象(数千个)向量,std::vector<event>并想检查它们是否满足布尔表达式。

到目前为止我已经实施的事情

  • 我实现了一个标记器和一个递归下降解析器来将布尔表达式转换为 AST。
  • 将终端存储为 a std::pair<std::string, std::string>,其中第一个值是结构字段名称,第二个是值。例如,std::pair<"name", "acbd">
  • 我穿过树,每当它看到一个终端树节点时:

问题

该结构包含 10 个成员。我想避免不必要的比较。在最坏的情况下,一个 AST 终端节点(例如pair<"type", "5000">)可能会导致 10 次比较。

我尝试构建这个查找图:

使用这张地图,我可以简化match()为:

  1. 我可以使用(eventObj + offset). 如何将其转换为正确的数据类型以进行比较?

  2. 目前,AST 终端节点中的所有字段值都是std::string. 如何在分词器或解析步骤中将其转换为正确的类型?我可以将 AST 节点存储为std::pair<std::string, std::any>但仍需要std::any_cast.

如果我能以某种方式将类型信息存储在字段映射中,这两个问题都可以解决。我不确定如何。