Russian Qt Forum
Май 07, 2024, 15:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: размер структуры в С++  (Прочитано 9795 раз)
Aik
Гость
« : Февраль 27, 2004, 13:44 »

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

struct T {
char a, b, c;
}

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

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

и кстати, размер char = 1 ... может ли эта цифра меняться в зависимости от платформы?
Записан
Rainbow
Гость
« Ответ #1 : Март 01, 2004, 13:19 »

Код:

int structsize = sizeof(T);
Записан
EugeneVC
Гость
« Ответ #2 : Март 01, 2004, 16:59 »

есть такая интересная штука у компилятора
aligment называется.
Тоесть компилятор будет выравнивать структуру на границу слова или выше.

Размер такой структуры T может быть или 4 байта или 8 байт

Вот так.
А к sizeof надо осторожно относится.
Записан
Anonymous
Гость
« Ответ #3 : Март 15, 2004, 15:44 »

Цитата: "EugeneVC"
есть такая интересная штука у компилятора
aligment называется.
Тоесть компилятор будет выравнивать структуру на границу слова или выше.

Размер такой структуры T может быть или 4 байта или 8 байт


Осмелюсь возразить, что aligment на размер структуры не влияет, он влияет только на её начальный адрес.

А чтобы структура занимала предполагаемый объем надо делать ее пакованной:
Код:
#pragma pack(1)

или так (только gcc):
Код:
class AxisScales
{
    float r0; // Zero offset
    float r; // step size
    short U; // phisical unit
public:
    AxisScales() {};
    ~AxisScales() {};
    void AxisPrint(char* dir,ostream& out = cout)
    {...
    }
} __attribute__ ((packed));

Цитата: "Aik"

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


Во всяком случая я такого не встречал: даже на 64-битном Sun'е char = 1 байту.

P.S.
Насчет aligment я конечно не настаиваю, просто мне так кажется.
Записан
EugeneVC
Гость
« Ответ #4 : Март 15, 2004, 16:04 »

наверно aligment для 4 байт делает обе вещи
1. выравнивает на границе 4 байт в памяти
2. sizeof() начинает возвращать число кратное 4
Записан
Злой
Гость
« Ответ #5 : Март 15, 2004, 17:04 »

Цитировать

Осмелюсь возразить, что aligment на размер структуры не влияет, он влияет только на её начальный адрес.
[/qoute]

alignment выравнивает не только начальный адрес, а все члены структуры. Например
Код:

struct A {
     char a;
     int b;
};

Допустим #pragma pack(4)
Тогда член a будет выравнен по адресу, кратном четырем. Занимает он один байт. Член b будет размещен не сразу за ним а с пропуском трех байт (выравнивание!). Так получается, что структура имеет размер восемь байт.

А если мы поменяем члены структуры местами
Код:

struct A {
   int b;
   char a;
};

то получим размер структуры 5 байт, но следующий объект в памяти будет размещен всё равно с пропуском в три байта.

По поводу последнего пункта я не уверен, может быть всё равно 8 байт, надо проверить.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 20.