Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> размер типов данных 
V
    Опции темы
susanin
Дата 8.3.2008, 00:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 587
Регистрация: 7.10.2006
Где: Санкт-Петербург

Репутация: 2
Всего: 7



как определяется размер таких типов данных как структура и класс?
PM MAIL   Вверх
Daevaorn
Дата 8.3.2008, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: нет
Всего: 70



Код

struct foobar { 
 int a, b;
};

const size_t size = sizeof( foobar );

или вопрос не про то?
PM MAIL WWW   Вверх
susanin
Дата 8.3.2008, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 587
Регистрация: 7.10.2006
Где: Санкт-Петербург

Репутация: 2
Всего: 7



немного не то.... хотелось знать из чего состоит размер??? что он из себя представляет? размер максимального элемента или же размер суммы всех элементов структуры/класс
PM MAIL   Вверх
MuForum
Дата 8.3.2008, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



Код

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

....

sizeof(PMSG_HEAD)



--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
susanin
Дата 8.3.2008, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 587
Регистрация: 7.10.2006
Где: Санкт-Петербург

Репутация: 2
Всего: 7



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

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 
PM MAIL   Вверх
MuForum
Дата 8.3.2008, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



# 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.


Это сообщение отредактировал(а) MuForum - 8.3.2008, 01:13


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
nickless
Дата 8.3.2008, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 2
Всего: 181



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][ ][ ][ ][ ][ ][ ][ ]


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


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Fazil6
Дата 8.3.2008, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



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

а указатель на таблицу виртуальных функций?
PM MAIL   Вверх
SABROG
Дата 8.3.2008, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 1
Всего: 91



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


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
MAKCim
Дата 8.3.2008, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



Цитата(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

Это сообщение отредактировал(а) MAKCim - 8.3.2008, 10:29


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
susanin
Дата 8.3.2008, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 587
Регистрация: 7.10.2006
Где: Санкт-Петербург

Репутация: 2
Всего: 7



со структурой понятно, а что насчет класса? как в нем определяется?
PM MAIL   Вверх
Daevaorn
Дата 8.3.2008, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: нет
Всего: 70



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

Абсолютно так же.
PM MAIL WWW   Вверх
susanin
Дата 8.3.2008, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 587
Регистрация: 7.10.2006
Где: Санкт-Петербург

Репутация: 2
Всего: 7



всем спасибо! за помощь! теперь буду знать!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0567 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.