LINUX.ORG.RU

размер структуры в С++


0

0

например есть сл. структура:

struct T {
char a, b, c;
}

сколько места она займет?
по теории это кол-во равно сумме размерностей компонентных данных - то есть 3...

а на практике?
возможны ли какие-либо вариации?

и кстати, размер char = 1 ... может ли эта цифра меняться в зависимости от платформы?

anonymous

sizeof (struct T); Меняться может.

sizeof(char) всегда 1, т.к. один char всегда занимает один char ;)

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

а как может меняться sizeof(T)?
и от чего это зависит?

и по поводу char:
если есть char c;
можем поместить инициализировать c одним или двумя символами...
тогда почему всегда 1?
(может вопрос глупый, но если можно растолкуй)

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

>а как может меняться sizeof(T)?
>и от чего это зависит?
Компилятор вправе назначить полям структуры любое угодное выравнивание - например, по машинному слову (при этом для каждой переменной имеющей этот тип он обязан использоать именно такое выравнивание).

>и по поводу char:
>если есть char c;
>можем поместить инициализировать c одним или двумя символами...
>тогда почему всегда 1?
>(может вопрос глупый, но если можно растолкуй)
В языке C память представляется как массив char, любой простой и составной тип всегда занимает кратный char объем памяти. sizeof возвращает сколько именно char занимает этот тип.

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

Маленькое дополнение, из этого не следует, что char это всегда 8 бит.
На DSP, например, это может быть и 16 и 32 бита.
Но в любом случае все данные (кроме битовых) кратны этой единице.

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

А как насчёт выравнивания полей структуры? Если, например по границе в 4 байта, то sizeof(T) вернёт 12. Чтоб отключить его (выравнирварие) надо использовать что-то типа ((__attribute_packed__)) для каждой структуры, если очень надо, то можно поискать в исходниках ядра в ветке, касающейся реализации TCP/IP - там точно есть.

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