与std :: vector的Offsetof函数

时间:2013-05-06 03:29:14

标签: c++ data-structures

有人可以向我解释为什么offsetof函数对std :: vectors不起作用,如下所示:

#include <windows.h>
#include <iostream>
#include <vector>

using namespace std;

struct FooStruct {
    double x;
    double y[10];
    std::vector<double> z;
};
int main() {
    cout << offsetof(FooStruct, x) << endl;
    cout << offsetof(FooStruct, y[2]) << endl;
    cout << offsetof(FooStruct, z[2]) << endl;

    system("Pause");
}

调用offsetof(FooStruct, z[2])会产生以下编译错误:

cannot apply 'offsetof' when 'operator[]' is overloaded

2 个答案:

答案 0 :(得分:2)

offsetof(FooStruct, z[2])毫无意义。 z中的元素不包含在FooStruct中,它们是通过std::vector访问的,z[2]的核心是指向堆上其他一些分配的指针std::vector可以找到。

在任何情况下,错误(我理解似乎令人困惑)都可能会弹出,因为operator[]重载class FooStruct,而不是因为operator[]重载z[2](其中,假设我们看到整个定义,它没有。)

如果您想找到z[0]相对于&z[0]的偏移量,您可以像这样计算&z[2]std::cout << (&z[2] - &z[0]) << '\n';之间的差异:{{1} }

答案 1 :(得分:1)

因为offsetof不是函数而是宏,只适用于POD类型或C ++ 11中的标准布局类。它仅用于向后兼容C。

编译器拒绝允许您使用订阅运算符的原因,除了所有问题之外,原因是宏在编译时进行了计算,但重载的运算符可能会在运行时执行一些工作来计算结果。