问题标签 [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++ - C++ 非 Pod 起始地址
在 C 中,结构的第一个元素与结构本身具有相同的地址。如果第一个元素是 POD,C++ 中的非 POD 结构是否也是如此?
例如,给定以下代码:
我收到“对 NULL 对象的非静态数据成员 'foo::node' 的无效访问......也许 offsetof 宏使用不正确”警告。
我的问题是 - 我可以假设“节点”在 foo 的开头(相同的地址),即使这是一个非 POD 结构?
如果是,我可以使用重新解释演员表,我不会收到任何警告:
那么,如果 C++ 结构以公共 POD 数据开头,那么第一个元素是否会根据标准共享对象的地址?
谢谢
--edit-- 在没有虚拟方法或超类的类中,假设(第一个成员变量的地址)== this 是否安全?被指出是一个可能的答案。它提到“在没有中间访问说明符的情况下声明的(非联合)类的非静态数据成员被分配,以便后面的成员在类对象中具有更高的地址。”这并没有真正解决是否第一个元素在我的情况下,与对象本身的地址相同。
我认为由于标准没有说明任何内容,我不能假设是这样。我可能需要将结构末尾的对象更改为指针,并根据需要处理分配它们。
c - x 宏打印错误的 offsetof() 信息
在 X 宏中使用 offsetof() 时出现明显错误,这让我感到很困惑。下面的代码显示了一个相当简单的结构的两个示例,一个显式定义,另一个使用 X 宏定义。然后将两个结构中每个结构字段的偏移量打印到屏幕上。正如您在下面的评论中看到的那样,用 X 宏定义的结构中的c字段显示了不正确的偏移量。
我相信这是一个打印问题。有人可以解释一下这个谜团吗?
c++ - 编译时或使用 IDE 时结构成员的偏移量
我怎么知道结构的所有成员是如何位于内部的?我需要详细列出所有偏移量和大小是否有任何 IDE 插件,我使用 Visual Studio 2013?我不能使用 offset of 或类似的东西,因为我需要有关所有字段的信息
谢谢
c++ - C ++中的结构偏移和指针安全
这个问题是关于使用带有结构偏移的指针算术派生的指针。
考虑以下程序:
该程序似乎可以使用默认设置和 C++11 标准在我测试的编译器上运行并给出预期的结果。
(一个密切相关的程序,我们使用void *
而不是char *
和static_cast
代替reinterpret_cast
,并没有被普遍接受。gcc 5.4
发出关于使用 void 指针的指针算术的警告,并clang 6.0
说指针算术 withvoid *
是一个错误。)
该程序是否具有根据 C++ 标准明确定义的行为?
答案是否取决于实现是否具有宽松或严格的指针安全性([basic.stc.dynamic.safety]
)?
c++ - 有没有办法为没有 UB 的非 POD 类型实现 offsetof?
对于类型 T 及其成员变量 m,offsetof(T, m) 的最简单形式是
虽然很明显是UB。假设 T 是 POD 或非 POD 但没有虚拟继承,有没有办法在不涉及 UB 的情况下做同样的事情?或者,有没有办法确保在编译时在当前实现(正在编译代码)下保证表达式被评估为正确的值?
目前,我在当前版本的 GCC、Clang 和 Visual C++ 中使用上述表达式没有任何问题,但它受到了最近在我们的代码库中强制执行的 GCC 的未定义行为清理程序的威胁。
c - 通过 offsetof 访问成员是否定义明确?
使用 进行指针运算时offsetof
,获取结构的地址,将成员的偏移量添加到其中,然后取消引用该地址以获取基础成员,这是明确定义的行为吗?
考虑以下示例:
这应该打印“那里。”,“你?” 和“好”。在三个连续的行上,它目前使用 clang 和 gcc,因为您可以在wandbox上验证自己。但是,我不确定这些指针转换和算术是否违反了某些会导致行为未定义的规则。
c - 使用 offsetof() 获取成员不可知函数的成员指针
假设我有一个struct
喜欢:
即,它包含多个“下一个”指针同时位于多个链表上。如果我想编写一个可以跟随任何“下一个”指针的函数,我可以传递我想要的“下一个”指针的偏移量,例如:
wherePTR_OFFSET
是一个宏,给定一个指向 some 的指针struct
,我想要的成员的类型(在这种情况下,S*
),以及我想要的成员的偏移量,然后取消引用该指针,我可以获得想要的成员的值。
要获得偏移量,我可以编写一个前端宏来调用S_free_impl()
它offsetof
:
然后像这样使用它:
宏的初始实现PTR_OFFSET
可以是:
但是,如果你编译,比如说,使用gcc -Wcast-align
,你会得到:
抑制警告的一种方法是编写一种与 C++ 等效的 C reinterpret_cast
:
然后重写PTR_OFFSET
以使用它:
然后警告消失,因为通过a投射uintptr_t
。
问题是:这是在 C 中获得我想要的东西的最佳(最便携)方式吗?具体来说:
struct
编写对不同成员(相同类型)进行操作的函数的能力。- 一种使用返回的值
offsetof
将其转换为实际指向成员的指针的可移植方式。
c - C - 取消引用术语后的引用
这个问题是关于术语的。
Gcc 发出警告Dereferencing void pointer。
我理解这个警告,因为编译器需要计算实际偏移量,而它不能因为void
没有标准大小。
但我不同意错误信息。这不是取消引用。我找不到一个取消引用的解释,它是什么,而不是取值。
offsetof 也一样:
由于空指针取消引用,有很多关于这是否是 UB 的线程。但这不是空指针取消引用!是吗?
汇编代码中没有存储访问权限
取消引用和存储访问有什么区别?
c++ - 为什么 offsetof 的实现在 C 和 C++ 上有奇怪的不同?
我打开stddef.h
看到这个:
在(在 C++ 编译器的情况下)的分支中,__cplusplus
有一个非常奇怪的实现,我认为它是多余的。其他分支(C 编译器的情况)具有更简单的字段偏移计算。我测试了它,它有效。在第一种情况下使用这种奇怪的强制转换和类型限定符是为了什么?
c++ - 对于 C++17 中的非标准布局类,“有条件地支持”`offsetof` 意味着什么?
C++17 标准在[support.types.layout]中说:
有条件地支持将宏与标准布局
offsetof
类以外的类型一起使用。
有条件支持
不需要实现来支持的程序结构
我觉得这个定义offsetof
不是很精确。
这是否意味着我可以安全地尝试将它与非标准布局类一起使用?
“有条件支持”与定义的实现有何不同?
编译器是否不支持
offsetof
生成诊断所需的特定类型的类?