Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.58/19: Рейтинг темы: голосов - 19, средняя оценка - 4.58
54 / 54 / 9
Регистрация: 09.11.2010
Сообщений: 120
1

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

15.02.2011, 01:21. Просмотров 3563. Ответов 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.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.02.2011, 01:21
Ответы с готовыми решениями:

Размер файла в байтах
Во первых надо узнать размер файла в байтах, фаил открыт потока ifstream fr, функция sizeof(fr)...

Размер памяти в байтах
Подскажите, пожалуйста, как узнать колл-во байт между двумя указателями? Т.е. к примеру: int *a...

Размер переменных в байтах
Доброго времени суток! Не могу разобраться в переводах из шестнадцатиричной системы счисления в...

Подсчитать размер файлов F1 и F2 (в байтах)
Постановка задачи: Создать текстовый файл F1 не менее, чем из 10 строк и записать в него...

6
Maniac
Эксперт С++
1446 / 948 / 158
Регистрация: 02.01.2009
Сообщений: 2,813
Записей в блоге: 1
15.02.2011, 02:05 2
Escapable, Компилятор занимается оптимизацией и выравнивает данные на удобную ему границу..
1
2112 / 1653 / 824
Регистрация: 21.12.2010
Сообщений: 2,926
Записей в блоге: 12
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);
}
1
Jesus loves me
Эксперт С++
5096 / 3110 / 351
Регистрация: 12.12.2009
Сообщений: 7,853
Записей в блоге: 2
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.
1
54 / 54 / 9
Регистрация: 09.11.2010
Сообщений: 120
15.02.2011, 14:44  [ТС] 5
Kastaneda, так получается что это зависит от конкретного компилятора?
0
Jesus loves me
Эксперт С++
5096 / 3110 / 351
Регистрация: 12.12.2009
Сообщений: 7,853
Записей в блоге: 2
15.02.2011, 16:23 6
Цитата Сообщение от Escapable Посмотреть сообщение
Kastaneda, так получается что это зависит от конкретного компилятора?
К сожалению мои познания в этой области не на столько глубоки. Но по-моему выравнием занимаются все компиляторы, даже когда на АСМе писал, то тоже с этим сталкивался. Еще я знаю, что в компиляторах есть опция, которая позволяет отключить это выравнивание, это бывает очень нужно.
0
Эксперт C
24542 / 15166 / 3206
Регистрация: 24.12.2010
Сообщений: 32,529
15.02.2011, 17:10 7
У Борланда есть такая директива #pragma pack, которая задает выравнивание.
Но обращаться с ней надо очень осторожно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.02.2011, 17:10

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Вычислить размер файла в байтах
используя функции seekg и tellg class fileTxt { public: fileTxt() {}; ~fileTxt() {};...

Как измерить размер функции в байтах?
вот есть функция. сколько байт она занимает?

Как узнать размер std::wstring в байтах?
:) ну как бэ вопрос в шапке :)

Найти максимальные и минимальные значения переменных, указать размер в байтах
помогите плиз. очень надо написать эту программу Написать прогу которая подсчитывает макс. и...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.