- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在研究如何在 C++ 中获取类的成员的内存偏移量,并在 wikipedia: 上遇到了这个问题。
In C++ code, you can not use offsetof to access members of structures or classes that are not Plain Old Data Structures.
class Foo
{
private:
int z;
int func() {cout << "this is just filler" << endl; return 0;}
public:
int x;
int y;
Foo* f;
bool returnTrue() { return false; }
};
int main()
{
cout << offsetof(Foo, x) << " " << offsetof(Foo, y) << " " << offsetof(Foo, f);
return 0;
}
Laptop:test alex$ ./test
4 8 12
最佳答案
简短回答:offsetof 是仅在 C++ 标准中才有的功能,用于兼容旧的 C。因此,它基本上仅限于可以在 C 中完成的内容。C++ 仅支持 C 兼容性所必须的内容。
由于 offsetof 基本上是一种依赖于支持 C 的简单内存模型的 hack(作为宏实现),因此 C++ 编译器实现者在如何组织类实例布局方面需要很大的自由。
结果是 offsetof 在 C++ 中通常会工作(取决于使用的源代码和编译器),即使在没有标准支持的情况下 - 除非它没有。所以你应该非常小心在 C++ 中使用 offsetof,特别是因为我不知道一个编译器会为非 POD 使用生成警告......现代 GCC 和 Clang 将发出警告如果 offsetof
在标准之外使用 ( -Winvalid-offsetof
)。
编辑:例如,如您所问,以下内容可能会澄清问题:
#include <iostream>
using namespace std;
struct A { int a; };
struct B : public virtual A { int b; };
struct C : public virtual A { int c; };
struct D : public B, public C { int d; };
#define offset_d(i,f) (long(&(i)->f) - long(i))
#define offset_s(t,f) offset_d((t*)1000, f)
#define dyn(inst,field) {\
cout << "Dynamic offset of " #field " in " #inst ": "; \
cout << offset_d(&i##inst, field) << endl; }
#define stat(type,field) {\
cout << "Static offset of " #field " in " #type ": "; \
cout.flush(); \
cout << offset_s(type, field) << endl; }
int main() {
A iA; B iB; C iC; D iD;
dyn(A, a); dyn(B, a); dyn(C, a); dyn(D, a);
stat(A, a); stat(B, a); stat(C, a); stat(D, a);
return 0;
}
a
时会崩溃内型
B
静态,当实例可用时它工作。这是因为虚拟继承,其中基类的位置存储在查找表中。
关于c++ - 为什么不能在 C++ 中的非 POD 结构上使用 offsetof?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1129894/
使用 OFFSETOF 宏更新结构字段的代码 #include #define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT))
刚看到What does the following macro do?我要问我自己的问题:为什么这么多应用程序的 header 定义 offsetof他们自己? 有什么原因吗?不靠谱? 最佳答案
来自 C++ 标准: A standard-layout class is a class that: — has no non-static data members of type non-sta
我想知道一个简单的宏 offset_of_ 是否需要对 not 的指针取消引用。例如,一个 C++(意味着这段代码将使用 C++ 编译器编译)结构,它声明了 packed 属性 struct A {
我想要 mystruct1 中的 offsetof() 参数行。我试过了 offsetof(struct mystruct1, rec.structPtr1.u_line.line) 还有 offse
就在这个问题因重复而被驳回之前,大多数(如果不是全部)问题都已接受答案,并带有过时/未定义的行为解决方案。 问题: 有没有办法在编译时获得指向成员数据的指针的偏移量: 不依赖于未定义的行为(nullp
我编写了一个小函数来获取结构内部字段的字节偏移量,但为了实现这一点,我每次都会迭代这些字段,直到找到符号。然而,在 C 中,offsetof() 仅在编译时计算一次,因为结构内部的偏移量不再改变。我想
当我这样定义结构时: struct abc{ int member1; int arr_member1; std::vector mVector; } 并且想要创建一个 arr_member 变
我必须在已经存在的大代码中添加一段代码。我的代码中有一个指针,*Ptr。该指针的类型为 unsigned char。 无符号字符 *Ptr; 我有以下结构。 struct { uint8_t t
相关文章: [c 循环双链表:rev 遍历为同一节点提供不同的列表指针地址](c circular double linked-list: rev traverse gives different l
这个问题已经有答案了: 已关闭11 年前。 社区去年审查了是否重新开放此问题,并将其关闭: 原始关闭原因未解决 Possible Duplicate: Why does this C code wor
根据我的另一个问题,这是一个我想避免 offsetof 的具体示例。 为了与 glVertexAttribPointer 一起使用,我必须对最后一个参数使用 offsetof。 glVertexAt
我想在这里实现“GetParent()”函数- class ChildClass; class ParentClass { public: .... ChildClass childO
我看到了offsetof这两个宏: #if defined(_MSC_VER) && !defined(_CRT_USE_BUILTIN_OFFSETOF) #ifdef __cplusplus
我有以下代码,以便能够访问结构数组中的多个字段(为简单起见,我已将其减少为两个)。最终指针计算的正确咒语是什么 *(ptr + offset) = 数据;因为我总是得到: 错误:从类型“int32_t
我一直在尝试使用宏连接 (##) 和 offsetof 宏来生成标识符,但没有成功: CMain.c:55: warning: implicit declaration of function 'Co
我正在尝试以下列方式使用 offsetof 宏: typedef unsigned char u8; typedef unsigned short u16; struct MapBlock { u
我正在尝试在我自己的另一个宏中使用 offsetof 宏,如下所示: #define MY_MACRO(struct_type, member) \ my_function(param1, o
这个问题在这里已经有了答案: Why does this implementation of offsetof() work? (8 个答案) 关闭 3 年前。 offsetof 在stddef.h
我试图通过使用 offsetof() 宏来学习如何访问结构成员,我遇到了这个例子 How can I access structure fields by name at run time?这一行:
我是一名优秀的程序员,十分优秀!