Форум программистов, компьютерный форум CyberForum.ru

Размер объекта в байтах - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.63
Escapable
53 / 53 / 1
Регистрация: 09.11.2010
Сообщений: 120
15.02.2011, 01:21     Размер объекта в байтах #1
Разъясните пожалуйста следующую ситуацию.
Почему при таком
C++
1
2
3
4
5
6
class A
{
     int x;
     int y;
     double a;
};
и таком объявлениях
C++
1
2
3
4
5
 class A
{
    int x;
    double a;
};
размер объекта составляет 16 байт?
C++
1
2
A ob;
cout << sizeof(ob) << endl; // 16 байт
Но при таком 24?
C++
1
2
3
4
5
6
class A
{
     int x;
     double a;
     int y;
};
C++
1
cout << sizeof(ob) << endl; // 24 байта
В чем тут магия? Первый вариант ясен и логичен но вот с остальными ... Неужели последовательность объявлений играет такую важную роль? И почему второй пример (в котором на одну переменную меньше (по логике должно быть 12 байт)) занимает столько же места в памяти как и первый?

PS VS2008, XP 32.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
15.02.2011, 02:05     Размер объекта в байтах #2
Escapable, Компилятор занимается оптимизацией и выравнивает данные на удобную ему границу..
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
15.02.2011, 02:22     Размер объекта в байтах #3
а вот и смещения
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>
#include<cstddef>
using namespace std;
 
class A{
    public:
         int x;
         double a;
         int y;
};
 
int main(){
    cout<<offsetof(A, x)<<"\n",
    cout<<offsetof(A, a)<<"\n",
    cout<<offsetof(A, y)<<"\n",
    cout<<sizeof(A);
}
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
15.02.2011, 13:30     Размер объекта в байтах #4
Как писал ISergey, компилятор выравнивает данные, в данном случае по размеру наибольшего типа double (8 байт), это нужно для более быстрого обращения к данным во время выполнения программы.
C++
1
2
3
4
5
class A
{
     int x;
     double a;
};
Тут тип int "выровнялся" до 8 байт (как double), поэтому размер класса 16 байт.
C++
1
2
3
4
5
6
class A
{
     int x;
     double a;
     int y;
};
Тут анологично, итого 3*8=24 байта
C++
1
2
3
4
5
6
class A
{
     int x;
     int y;
     double a;
};
А здесь по какой-то причине компилятор решил, что ему и так нормально, (int - 4 байта, число четное, поэтому адресовывать все равно удобно) и не стал "расширять" переменные int.
Escapable
53 / 53 / 1
Регистрация: 09.11.2010
Сообщений: 120
15.02.2011, 14:44  [ТС]     Размер объекта в байтах #5
Kastaneda, так получается что это зависит от конкретного компилятора?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
15.02.2011, 16:23     Размер объекта в байтах #6
Цитата Сообщение от Escapable Посмотреть сообщение
Kastaneda, так получается что это зависит от конкретного компилятора?
К сожалению мои познания в этой области не на столько глубоки. Но по-моему выравнием занимаются все компиляторы, даже когда на АСМе писал, то тоже с этим сталкивался. Еще я знаю, что в компиляторах есть опция, которая позволяет отключить это выравнивание, это бывает очень нужно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.02.2011, 17:10     Размер объекта в байтах
Еще ссылки по теме:

C++ Написать прогу, которая подсчитывает макс. и мин. значения переменных (int, shorting, longint, uint, char, uchar), ещё указать размер в байтах
C++ Как узнать размер std::wstring в байтах?
C++ Размер переменных в байтах

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Байт
 Аватар для Байт
13993 / 8824 / 1231
Регистрация: 24.12.2010
Сообщений: 15,990
15.02.2011, 17:10     Размер объекта в байтах #7
У Борланда есть такая директива #pragma pack, которая задает выравнивание.
Но обращаться с ней надо очень осторожно.
Yandex
Объявления
15.02.2011, 17:10     Размер объекта в байтах
Ответ Создать тему
Опции темы

Текущее время: 07:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru