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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.63
Escapable
54 / 54 / 1
Регистрация: 09.11.2010
Сообщений: 120
#1

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

15.02.2011, 01:21. Просмотров 2384. Ответов 6
Метки нет (Все метки)

Разъясните пожалуйста следующую ситуацию.
Почему при таком
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.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2011, 01:21     Размер объекта в байтах
Посмотрите здесь:

Размер памяти в байтах C++
... В четных байтах числа в двоичной системе переместить нулевые биты в старшие биты, а в нечетных байтах – в младшие ... C++
C++ как измерить размер функции в байтах?
Размер файла в байтах C++
C++ Найти максимальные и минимальные значения переменных, указать размер в байтах
C++ написать, прогу которая подсчитывает макс. и мин. значения переменных (int, shorting, longint, uint, char, uchar), ещё указать размер в байтах
написать прогу, которая подсчитывает макс. и мин. значения переменных (int, shorting, longint, uint, char, uchar), ещё указать размер в байтах C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1345 / 878 / 51
Регистрация: 02.01.2009
Сообщений: 2,643
Записей в блоге: 1
15.02.2011, 02:05     Размер объекта в байтах #2
Escapable, Компилятор занимается оптимизацией и выравнивает данные на удобную ему границу..
igorrr37
 Аватар для igorrr37
1600 / 1228 / 121
Регистрация: 21.12.2010
Сообщений: 1,875
Записей в блоге: 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
4253 / 2785 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 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
54 / 54 / 1
Регистрация: 09.11.2010
Сообщений: 120
15.02.2011, 14:44  [ТС]     Размер объекта в байтах #5
Kastaneda, так получается что это зависит от конкретного компилятора?
Kastaneda
Форумчанин
Эксперт С++
 Аватар для Kastaneda
4253 / 2785 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 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++ Размер объекта
Размер объекта? C++
C++ Как узнать размер std::wstring в байтах?
C++ Размер переменных в байтах

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

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

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