Название: размер структуры в С++ Отправлено: Aik от Февраль 27, 2004, 13:44 например есть сл. структура:
struct T { char a, b, c; } сколько места она займет? по теории это кол-во равно сумме размерностей компонентных данных - то есть 3... а на практике? возможны ли какие-либо вариации? и кстати, размер char = 1 ... может ли эта цифра меняться в зависимости от платформы? Название: Re: размер структуры в С++ Отправлено: Rainbow от Март 01, 2004, 13:19 Код:
Название: размер структуры в С++ Отправлено: EugeneVC от Март 01, 2004, 16:59 есть такая интересная штука у компилятора
aligment называется. Тоесть компилятор будет выравнивать структуру на границу слова или выше. Размер такой структуры T может быть или 4 байта или 8 байт Вот так. А к sizeof надо осторожно относится. Название: размер структуры в С++ Отправлено: Anonymous от Март 15, 2004, 15:44 Цитата: "EugeneVC" есть такая интересная штука у компилятора aligment называется. Тоесть компилятор будет выравнивать структуру на границу слова или выше. Размер такой структуры T может быть или 4 байта или 8 байт Осмелюсь возразить, что aligment на размер структуры не влияет, он влияет только на её начальный адрес. А чтобы структура занимала предполагаемый объем надо делать ее пакованной: Код: #pragma pack(1) или так (только gcc): Код: class AxisScales Цитата: "Aik" и кстати, размер char = 1 ... может ли эта цифра меняться в зависимости от платформы? Во всяком случая я такого не встречал: даже на 64-битном Sun'е char = 1 байту. P.S. Насчет aligment я конечно не настаиваю, просто мне так кажется. Название: размер структуры в С++ Отправлено: EugeneVC от Март 15, 2004, 16:04 наверно aligment для 4 байт делает обе вещи
1. выравнивает на границе 4 байт в памяти 2. sizeof() начинает возвращать число кратное 4 Название: размер структуры в С++ Отправлено: Злой от Март 15, 2004, 17:04 Цитировать Осмелюсь возразить, что aligment на размер структуры не влияет, он влияет только на её начальный адрес. [/qoute] alignment выравнивает не только начальный адрес, а все члены структуры. Например Код:
Допустим #pragma pack(4) Тогда член a будет выравнен по адресу, кратном четырем. Занимает он один байт. Член b будет размещен не сразу за ним а с пропуском трех байт (выравнивание!). Так получается, что структура имеет размер восемь байт. А если мы поменяем члены структуры местами Код:
то получим размер структуры 5 байт, но следующий объект в памяти будет размещен всё равно с пропуском в три байта. По поводу последнего пункта я не уверен, может быть всё равно 8 байт, надо проверить. |