Вопрос о расположении памяти - PullRequest
3 голосов
/ 14 октября 2010

У этих двух структур одинаковая схема памяти?(C ++)

struct A
{
   int x;
   char y;
   double z;
};

struct B
{
   A a;
};

Кроме того, я могу получить доступ к элементам x, y, z, если вручную приведу объект этого объекта к A?

struct C
{
   A a;
   int b;
};

Заранее спасибо.

РЕДАКТИРОВАТЬ:

Что если бы они были classes вместо structs?

Ответы [ 4 ]

7 голосов
/ 14 октября 2010

Да и да. Последний обычно используется для эмуляции ОО-наследования в С.

4 голосов
/ 14 октября 2010

Вы можете проверить это самостоятельно, проверив смещения полей относительно начала каждого экземпляра.

A aObj;
B bObj;
C cObj;

int xOffset1 = &aObj.x - &aObj;
int xOffset2 = &bObj.a.x - &bObj;

ASSERT(xOffset1 == xOffset2);

и т. Д.

2 голосов
/ 14 октября 2010

$ 9.2 / 16- "Два типа структуры стандартного макета (раздел 9) совместимы с макетом, если они имеют одинаковое количество элементов нестатических данных, а соответствующие элементы нестатических данных (в порядке декларации) совместимы с макетом типы (3.9). "

Так что ответ «да»

1 голос
/ 14 октября 2010

Да, это сработает. В зависимости от настроек упаковки структуры компилятора он может не работать с элементами, отличными от первого.

...