问题标签 [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.
c++ - 计算未知类型的成员偏移量
我想获取结构成员的偏移量。我知道这已被多次询问,答案总是强大的offsetof。好吧,我的情况有点不同:我需要一个未知类型的偏移量。例如:
我从未知中唯一知道的是设置类型的顺序。IE
这里的主要问题是对齐/填充,因为我不知道计算它的方法,也不知道是否有方法。
这类问题经常被回答为:你为什么要这样做?
对于那些人:我正在用 C++ 实现 JSON 解析器,但遇到了一个问题(表示多个类型数组),我的解决方案是将数组的值映射到自定义结构中。
我接受有关该解决方案的反馈,但我主要对我的问题得到回答感兴趣
c++ - standard_layout 类的数据成员是否会与对象的地址有固定的偏移量?
如果一个类is_standard_layout,是否足以保证给定的非静态数据成员将始终具有与对象地址相同的偏移量(即跨该类的不同实例,在进程范围内相同)?
c++ - 使用 offsetof() 从成员变量中获取所有者对象
我想在这里实现'GetParent()'功能 -
我试图创建一个私有成员变量来存储指向父对象的指针。然而,这种方法需要额外的内存。
所以我使用了 offsetof() 宏(调用 offsetof() 的性能成本可以忽略),但我不确定这种方法是否安全。它适用于所有情况吗?有没有更好的idea?
c++ - 通过强制转换 nullptr 获取成员变量的偏移量
我正在查看来自 的宏offsetof
,<cstddef>
并看到一个可能的实现是通过
我试过了,确实可以按预期工作
我所做的唯一修改是我使用最终转换为void*
而不是size_t
,因为我想将地址显示为指针。
我的问题:
- 代码是否完全合法,即通过 a “访问”成员是否合法
nullptr
,然后获取其地址?如果是这样,那么似乎&(((type*)nullptr)->member)
计算成员相对于0的地址,真的是这样吗?(似乎是这样,在最后 3 行中,我得到了相对于 的地址的偏移量s
)。 - 如果我
(void*)
从宏定义中删除最终转换为,我会得到一个段错误。为什么?不应该&(((type*)nullptr)->member)
是 type 的指针type*
,或者这里的类型是否被抹掉了?
c - 为什么 offsetof 宏是必要的?
我是 C 语言的新手,刚刚了解了结构和指针。
我的问题与offsetof
我最近看到的宏有关。我知道它是如何工作的以及其背后的逻辑。
在<stddef.h>
文件中定义如下:
我的问题是,如果我有如下所示的结构:
为什么我不能直接获取field2
as的地址:
而不是写这样的东西
然后将偏移值添加到 var 的起始地址?
有什么区别吗?使用offsetof
效率更高吗?
c - MACRO的offset难于理解
我一直在寻找很长很辛苦(最后的链接)来解释 offsetof MACRO 的实现:
特别是取消引用NULL以获得结构中成员的偏移量。许多文章通过说 NULL 指针实际上从未真正取消引用来掩盖原因,但这对我来说没有意义。
以下是我尝试理解的一些链接:
- http://www.viva64.com/en/b/0301/
- http://www.embedded.com/design/prototyping-and-development/4024941/Learn-a-new-trick-with-the-offsetof--macro
- http://www.geeksforgeeks.org/the-offsetof-macro/
- C offsetof 宏是如何工作的?
- 取消引用 NULL 指针是否保证 C/C++ 中的程序崩溃?
我正在寻找并试图理解的是一步一步,分解了对编译器如何解释 MACRO 定义的理解,这最终将解释 NULL 指针实际上是如何被取消引用的。
编辑:尽管其他问题回答了我的问题,但正如原始帖子中所指出的那样,它们对我来说没有意义。@dasblinkenlight 的回答揭示了我对其他问题的分析所遇到的确切问题,即我们实际上如何没有取消引用指针。
c - 如何使用`offsetof`以符合标准的方式访问字段?
假设我有一个结构并将偏移量提取到一个成员:
struct A
给定一个指针以符合标准的方式提取成员,我该如何做?当然假设我们有一个正确struct A*
和正确的偏移量。一种尝试是执行以下操作:
这可能会起作用,但请注意,例如,如果指针是同一数组的指针(或结束后的指针),则指针算术似乎仅在标准中定义,情况并非如此。因此从技术上讲,该构造似乎依赖于未定义的行为。
另一种方法是
这也可能会起作用,但请注意,intptr_t
它不需要存在,据我所知,算法intptr_t
不需要产生正确的结果(例如,我记得某些 CPU 有能力处理非字节对齐的地址,这将建议intptr_t
以 8 的步长为每个char
数组中的每个增加)。
看起来标准中忘记了一些东西(或者我错过了一些东西)。
c++ - 如何在所需的偏移量处设置结构元素
在嵌入式编程中,当描述硬件时,通常需要将结构元素放置在硬件工程师设计它们时已知的预定义位置。例如,让我们定义一个结构 FPGA,它有大约 100 个寄存器/区域,如下面的简化示例所示:
现在,我对手动计算以及在结构发生变化时可能出现的错误感到沮丧和愤怒。有什么方法可以做到这一点更健壮/方便吗?我试着这样写:
但这不会编译抱怨结构不完整...请注意,我的示例已简化。实际上,必须定义大约 20-30 个这样的备用字段 - 结构非常大。
cc - 使用 offsetof() 时的覆盖率扫描错误 RW.UNDEFINED_IDENTIFIER
Coverity 在尝试计算结构中成员的偏移量时检测到未定义的标识符。
确切的覆盖描述是“标识符 mem 未定义”。
我试过用 mem[0]、mem[] 替换 mem,从 struct A 中删除 typedef - 但似乎没有什么能解决它。如果有人指出可能会扰乱隐蔽性,那就太好了。
[更新#1]:我使用的是 ubuntu 16.04 (kernel - 4.4.0-38-generic),gcc/g++ 5.4.0,coverity 7.5.1
[更新#2]:具有这种结构和以下命令行选项的独立 test.c 可以保持覆盖率:
有趣的是,当我编译整个项目时,它会导致同一行出现一堆错误:UNDEFINED_IDENTIFIER、ROUTINE_NOT_EMITTED、TYPE_IDENTIFIER_NOT_ALLOWED。
c - 如何获取C中嵌套结构成员的偏移量?
checksum
打印结构中字段偏移量的一种解决方案info
是使用宏typeof
和offsetof
:
不幸的是,typeof
这不是标准的,所以我正在寻找一种更方便的方法来编写上面的示例,而无需在info
外部声明 from S
。
为什么我要这样做?
我有一个代表信息块的闪存内容的大结构。这些块中的每一个都有一个我想检查的校验和:
由于typeof
.