LINUX.ORG.RU

sizeof(Bar)=?


0

0

допустим имеется такой код

struct Foo {};

struct Bar : public Foo {
int a;
};

чему в соответствие стандарту будет равен sizeof(Bar)?

★★★★★

IMHO не описано это в стандартах

Dead ★★★★
()

Чему угодно.

anonymous
()

а разве нет принципа что структура должна занимать как можно меньше?

fghj ★★★★★
() автор топика
Ответ на: комментарий от fghj

> а разве нет принципа что структура должна занимать как можно меньше?

Нет. Более того, есть такая вещь, как padding. Который, кстати, вполне может быть и в конце структуры, после всех полей. И он полностью implementation-defined.

int19h ★★★★
()
Ответ на: комментарий от int19h

>Который, кстати, вполне может быть и в конце структуры, после всех полей.

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

я говорю о конкретной структуре, имеющий одно поле типа int,
вы думаете какой-либо комплятор ее еще как-либо выравняет?

PS
> Более того, есть такая вещь, как padding

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

fghj ★★★★★
() автор топика
Ответ на: комментарий от int19h

если уж заговорили о выравнивание, имеем

struct A { uint32_t low : 16; uint32_t high : 16; };

может ли что-нибудь вставлено между полями low и high, опять же исходя из стандарта?

fghj ★★★★★
() автор топика
Ответ на: комментарий от fghj

> я говорю о конкретной структуре, имеющий одно поле типа int, вы думаете какой-либо комплятор ее еще как-либо выравняет?

А вот хз. Стандарт об этом _ничего_ не говорит. Так что оно вполне может в целях оптимизации растянуть эту структуру на 8 байт на 64-битном проце.

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

Выравнивание (alignment) - это результат. А "набивка" (padding) - это то, чем выравнивают. Согласись, русский термин звучит довольно глупо, и к тому же, не является универсальным или даже сколько-нибудь распространенным. А главное все-таки точность формулировок, а не борьба за чистоту языка (имхо, разумеется).

int19h ★★★★
()
Ответ на: комментарий от fghj

> может ли что-нибудь вставлено между полями low и high, опять же исходя из стандарта?

Нет. Когда идет подряд несколько битовых полей, то гарантируется отсутсвие padding между ними. Вот до них или после них - может быть.

int19h ★★★★
()
Ответ на: комментарий от fghj

В gcc, если сделать такое объявление:

struct CompactStruct {
    char a;
    long b;
    short c;
} __attribute__ ((packed));

..то выравнивания не будет. Такое расширение языка C.

erDiZz
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.