Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > размер типов данных


Автор: susanin 8.3.2008, 00:24
как определяется размер таких типов данных как структура и класс?

Автор: Daevaorn 8.3.2008, 00:25
Код

struct foobar { 
 int a, b;
};

const size_t size = sizeof( foobar );

или вопрос не про то?

Автор: susanin 8.3.2008, 00:28
немного не то.... хотелось знать из чего состоит размер??? что он из себя представляет? размер максимального элемента или же размер суммы всех элементов структуры/класс

Автор: MuForum 8.3.2008, 00:29
Код

#pragma pack(1)
// ----
struct PMSG_HEAD
{
    BYTE Type;
    WORD Size;
    BYTE Head;
};
// ----
#pragma pack()

....

sizeof(PMSG_HEAD)

Автор: susanin 8.3.2008, 00:39
хотелось знать из чего состоит размер??? что он из себя представляет? размер максимального элемента или же размер суммы всех элементов структуры/класс 
почему две структуры с одинаковыми данными имеют разный размер?? пример
Код

include <iostream>
#include <cmath>
using namespace std;

struct с
{
double a;
int b;
char i;
}r;

int main(void)
{
    cout<<sizeof(r);
    return 0;
}

выдает размер 16, а структура с теми же переменными, но расположенными в другом порядке,
Код

#include <iostream>
#include <cmath>
using namespace std;

struct с
{
int b;
double a;
char i;
}r;

int main(void)
{
    cout<<sizeof(r);
    return 0;
}

уже дает в результате 24.... не понимаю! smile 

Автор: MuForum 8.3.2008, 01:09
# 5, susanin - Используй то, что я тебе написал, и будет строгий контроль в указанном порядке!
Код

#pragma pack(1)
// ----
struct TEST
{
    int b;
    double a;
    char i;
};
// ----
struct TEST2
{
        double a;
        int b;
        char i;
};
// ----
#pragma pack()


# Result:
    sizeof(TEST) = '13' byte.
    sizeof(TEST2) = '13' byte.

Автор: nickless 8.3.2008, 01:49
susanin, размер - это сумма размеров элементов + выравнивание. Выравнивание (alignment) нужно для повышения скорости чтения/записи данных в памяти.

В твоих примерах выравнивание похоже = 8, т.е. в памяти эти структуры выглядят примерно так ([ ] = 1 байт):
Код

struct с
{
double a;
int b;
char i;
};

Код

[а][а][а][а][а][а][а][а][b][b][b][b][i][ ][ ][ ]


Код

struct с
{
int b;
double a;
char i;
};

Код

[b][b][b][b][ ][ ][ ][ ][a][a][a][a][a][a][a][a][i][ ][ ][ ][ ][ ][ ][ ]


Как оно действительно расположено в памяти зависит от компайлера.

Автор: Fazil6 8.3.2008, 09:36
Цитата(nickless @  8.3.2008,  00:49 Найти цитируемый пост)
susanin, размер - это сумма размеров элементов + выравнивание.

а указатель на таблицу виртуальных функций?

Автор: SABROG 8.3.2008, 09:43
pragma это конечно хорошо, но если речь зайдет о компиляторе gcc ? Что ж это получается sizeof полностью бесполезен ?

Автор: MAKCim 8.3.2008, 10:27
Цитата(nickless @  8.3.2008,  01:49 Найти цитируемый пост)
Выравнивание (alignment) нужно для повышения скорости чтения/записи данных в памяти.

дополню
скорость повышается засчет сокращения количества кэш-промахов (ни одно из полей структуры или сам объект структуры (размером меньше размера строки кэша) не может одновременно располагаться в двух строках кэша) 
Цитата(Fazil6 @  8.3.2008,  09:36 Найти цитируемый пост)
а указатель на таблицу виртуальных функций? 

он является элементом (только неявным)

Цитата(SABROG @  8.3.2008,  09:43 Найти цитируемый пост)
Что ж это получается sizeof полностью бесполезен ? 

а в чем проблема?
sizeof возвращает реальный размер объекта
зачем беспокоиться о выравнивании?
а если уж надо беспокоится, то скорее всего кроссплатформенность здесь уже не уместна
если уж сильно надо, то GCC поддерживает #pragma pack(...) для совместимости с Win32

Автор: susanin 8.3.2008, 21:02
со структурой понятно, а что насчет класса? как в нем определяется?

Автор: Daevaorn 8.3.2008, 21:09
Цитата(susanin @  8.3.2008,  22:02 Найти цитируемый пост)
со структурой понятно, а что насчет класса? как в нем определяется? 

Абсолютно так же.

Автор: susanin 8.3.2008, 21:36
всем спасибо! за помощь! теперь буду знать!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)