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

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

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

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

15.02.2011, 01:21. Просмотров 2439. Ответов 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++
Во первых надо узнать размер файла в байтах, фаил открыт потока ifstream fr, функция sizeof(fr) возвращяет значение 176, фаил имеет...

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

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

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

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

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

Программа определяет код символа по кодовой таблицей ASCII и определяет размер типа данных в байтах - C++
#include&lt;stdio.h&gt; #include&lt;conio.h&gt; #include &lt;stdlib.h&gt; int main() {puts(&quot;My first program&quot;); //вывод сообщения char s='a'; int...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ISergey
Maniac
Эксперт С++
1372 / 883 / 52
Регистрация: 02.01.2009
Сообщений: 2,652
Записей в блоге: 1
15.02.2011, 02:05     Размер объекта в байтах #2
Escapable, Компилятор занимается оптимизацией и выравнивает данные на удобную ему границу..
igorrr37
1641 / 1269 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 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
Форумчанин
Эксперт С++
4479 / 2841 / 226
Регистрация: 12.12.2009
Сообщений: 7,222
Записей в блоге: 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
Форумчанин
Эксперт С++
4479 / 2841 / 226
Регистрация: 12.12.2009
Сообщений: 7,222
Записей в блоге: 1
Завершенные тесты: 1
15.02.2011, 16:23     Размер объекта в байтах #6
Цитата Сообщение от Escapable Посмотреть сообщение
Kastaneda, так получается что это зависит от конкретного компилятора?
К сожалению мои познания в этой области не на столько глубоки. Но по-моему выравнием занимаются все компиляторы, даже когда на АСМе писал, то тоже с этим сталкивался. Еще я знаю, что в компиляторах есть опция, которая позволяет отключить это выравнивание, это бывает очень нужно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.02.2011, 17:10     Размер объекта в байтах
Еще ссылки по теме:

Написать прогу, которая подсчитывает макс. и мин. значения переменных (int, shorting, longint, uint, char, uchar), ещё указать размер в байтах - C++
Программа должна содержать функцию printf. Без функции std::count и т.п.

написать, прогу которая подсчитывает макс. и мин. значения переменных (int, shorting, longint, uint, char, uchar), ещё указать размер в байтах - C++
Написать желательно простейшим языком(без применения каких-то очень навороченных функций). Помогите, плиз

написать прогу, которая подсчитывает макс. и мин. значения переменных (int, shorting, longint, uint, char, uchar), ещё указать размер в байтах - C++
помогите плиз. желательно, чтобы программа была написана максимально простым способом

Размер объекта - C++
Только что прочитал такую статью - http://devdoc.web-ide.ru/index.php/content/view/virtual_base.htm И там написано &quot;Создание объекта –...

Размер объекта? - C++
При работе с объектами, совсем не знал забыл следующие моменты: Зависит ли размер объекта от количества в нем методов ? Будет ли...


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

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

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