Почему вы не можете использовать offsetof на не-POD структурах в C ++? - PullRequest
49 голосов
/ 15 июля 2009

Я изучал, как получить смещение памяти члена класса в C ++, и наткнулся на это в wikipedia:

В коде C ++ нельзя использовать offsetof для доступа к членам структур или классов, которые не являются простыми старыми структурами данных.

Я попробовал, и, кажется, работает нормально.

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

Я думаю, что я либо неправильно понимаю, что такое структура данных POD, либо мне не хватает какой-то другой части головоломки. Я не вижу, в чем проблема.

Ответы [ 11 ]

0 голосов
/ 15 июля 2009

Если вы добавите, например, виртуальный пустой деструктор:

virtual ~Foo() {}

Ваш класс станет «полиморфным», т. Е. У него будет скрытое поле члена, которое является указателем на «vtable», который содержит указатели на виртуальные функции.

Из-за скрытого поля элемента размер объекта и смещение элементов не будут тривиальными. Таким образом, вы должны получить проблемы при использовании offsetof.

...