Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Странный sizeof объекта / 25 сообщений из 25, страница 1 из 1
02.09.2013, 17:52
    #38384497
TimeCoder
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный sizeof объекта
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
#include <iostream>

class Foo1
{
	short int a;
	char b;
};

class Foo2
{
	char a;
	char b;
	char c;
};


int main()
{
	std::cout 
		<< sizeof(Foo1) 
		<< " "
		<< sizeof(Foo2)
		<< std::endl;

	return 0;
}


Как вы думаете, что будет на экране?:-) У меня только один вопрос: ПОЧЕМУ так?
...
Рейтинг: 0 / 0
02.09.2013, 18:22
    #38384519
3 3
3 3
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный sizeof объекта
Как что:
вывод3 3
http://ideone.com/vyVCfN
...
Рейтинг: 0 / 0
02.09.2013, 18:37
    #38384538
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный sizeof объекта
TimeCoderКак вы думаете, что будет на экране?:-) У меня только один вопрос: ПОЧЕМУ так?
Вообще, стандартом не описано какие конкретно размеры у short и char.
Так что зависит от платформы.
Кроме того выравнивание тоже зависит от платформы и компилятора.

На x86 при включенной оптимизации по скорости размеры структур должны быть 4 и 3.
...
Рейтинг: 0 / 0
02.09.2013, 19:18
    #38384588
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный sizeof объекта
TimeCoder,

А никак не надо думать, стандарт это не оговаривает.
...
Рейтинг: 0 / 0
02.09.2013, 19:21
    #38384591
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный sizeof объекта
Anatoly MoskovskyTimeCoderКак вы думаете, что будет на экране?:-) У меня только один вопрос: ПОЧЕМУ так?
Вообще, стандартом не описано какие конкретно размеры у short и char.
Так что зависит от платформы.
Кроме того выравнивание тоже зависит от платформы и компилятора.

На x86 при включенной оптимизации по скорости размеры структур должны быть 4 и 3.

У char как раз размер определен. 1 байт.
А вот у структуры, содержащей 3 char — уже нет.
...
Рейтинг: 0 / 0
02.09.2013, 19:59
    #38384628
TimeCoder
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный sizeof объекта
У меня в MS VS2012 выводится 4 и 3. Почему во втором случае не произошло выравнивания?
...
Рейтинг: 0 / 0
02.09.2013, 20:07
    #38384637
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный sizeof объекта
MasterZivУ char как раз размер определен. 1 байт.
Да, про char это я забыл.
...
Рейтинг: 0 / 0
02.09.2013, 20:08
    #38384638
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный sizeof объекта
TimeCoderУ меня в MS VS2012 выводится 4 и 3. Почему во втором случае не произошло выравнивания?
Потому что на x86 выравнивание char - 1
...
Рейтинг: 0 / 0
02.09.2013, 20:18
    #38384652
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный sizeof объекта
Anatoly MoskovskyПотому что на x86 выравнивание char - 1
Тогда почему у первой структуры размер 4? Я бы понял, если бы он был 5 или 3, но 4?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.09.2013, 20:37
    #38384660
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный sizeof объекта
Dimitry SibiryakovТогда почему у первой структуры размер 4? Я бы понял, если бы он был 5 или 3, но 4?..
Выравнивания членов структур влияют на размер структуры не на прямую .
У структуры выравнивание равно максимальному выравниванию членов (также обычно есть ограничение сверху заданное компилятором). Из-за этого члены с меньшим выравниванием упаковываются если идут подряд, а если нечего упаковывать, то дополняются пустотой до выравнивания структуры.
Поэтому у структуры 1 выравнивание 2 (2 у short, 1 - у char), а размер структуры получается 4 (2 - размер short + 1 размер char + 1 заполняющий байт ).
Если бы было например, short, char, char тогда размер структуры был бы тоже 4 (2 - размер short + 2 - размер двух упакованных подряд char)
...
Рейтинг: 0 / 0
02.09.2013, 20:41
    #38384669
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный sizeof объекта
Dimitry SibiryakovЯ бы понял, если бы он был 5 или 3, но 4?..
Размер структур всегда кратен степени двойки (если не играться с pragma pack), потому что на большинстве платформ скорость доступа таким структурам больше.
...
Рейтинг: 0 / 0
02.09.2013, 20:43
    #38384671
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный sizeof объекта
Anatoly MoskovskyРазмер структур всегда кратен степени двойки (если не играться с pragma pack), потому что на большинстве платформ скорость доступа таким структурам больше.
А, ну кроме структур состоящих только из char :)
...
Рейтинг: 0 / 0
02.09.2013, 20:47
    #38384679
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный sizeof объекта
Anatoly MoskovskyРазмер структур всегда кратен степени двойки

Если к первой структуре добавить ещё short, он станет 6. Э?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.09.2013, 20:51
    #38384684
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный sizeof объекта
Dimitry Sibiryakov,

Да
...
Рейтинг: 0 / 0
02.09.2013, 20:54
    #38384687
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный sizeof объекта
Dimitry SibiryakovЯ бы понял, если бы он был 5 или 3, но 4?..
А можете описать логику, по которой могло бы получиться 5?
...
Рейтинг: 0 / 0
02.09.2013, 20:56
    #38384690
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный sizeof объекта
Anatoly MoskovskyДа
6 - не степень двойки.

Anatoly MoskovskyА можете описать логику, по которой могло бы получиться 5?

short int можно дополнить до int чтобы вытягивался из структуры быстрее.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.09.2013, 21:00
    #38384695
TimeCoder
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный sizeof объекта
Anatoly MoskovskyПотому что на x86 выравнивание char - 1
Т.е. выравнивание размера класса происходит в зависимости от последнего объявленного поля данных?
...
Рейтинг: 0 / 0
02.09.2013, 21:08
    #38384705
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный sizeof объекта
Dimitry SibiryakovAnatoly MoskovskyДа
6 - не степень двойки.

Так я не про степень двойки, а про кратность степени двойки )
Dimitry SibiryakovAnatoly MoskovskyА можете описать логику, по которой могло бы получиться 5?

short int можно дополнить до int чтобы вытягивался из структуры быстрее.
Понятно.
Но это неверная логика, в чем можно убедиться если рассмотреть массив из двух элементов этой структуры.
В случае размера структуры 5 второй элемент массива будет не выровнен.
А в случае если размер 4 (точнее, соответствует описанным мной выше правилам) то выравнивания любых элементов массива, а также членов, одинаковы и равны наиболее оптимальному для платформы.
...
Рейтинг: 0 / 0
02.09.2013, 21:08
    #38384707
Странный sizeof объекта
TimeCoderAnatoly MoskovskyПотому что на x86 выравнивание char - 1
Т.е. выравнивание размера класса происходит в зависимости от последнего объявленного поля данных?
Нет. Общее правило для всех компиляторов такое - каждый элемент в массиве структур должен иметь смещение от начала этого массива кратное его размеру . А все остальное уже свистопляски вокруг этого правила. Вот и думайте как компилятор будет этого добиваться.
Иногда от этого правила отходят для long long и double.
...
Рейтинг: 0 / 0
02.09.2013, 21:10
    #38384710
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный sizeof объекта
TimeCoderТ.е. выравнивание размера класса происходит в зависимости от последнего объявленного поля данных?
Почему же от последнего?
От всех зависит. Я выше описал как именно. 14786591
...
Рейтинг: 0 / 0
03.09.2013, 07:16
    #38384864
?
?
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный sizeof объекта
Общее правилоTimeCoderпропущено...

Т.е. выравнивание размера класса происходит в зависимости от последнего объявленного поля данных?
Нет. Общее правило для всех компиляторов такое - каждый элемент в массиве структур должен иметь смещение от начала этого массива кратное его размеру . А все остальное уже свистопляски вокруг этого правила. Вот и думайте как компилятор будет этого добиваться.
Иногда от этого правила отходят для long long и double.Ну не совсем так, это может зависеть от реализации. А вообще кроме sizeof есть еще и alignof
...
Рейтинг: 0 / 0
03.09.2013, 13:09
    #38385324
Странный sizeof объекта
?Общее правилопропущено...

Нет. Общее правило для всех компиляторов такое - каждый элемент в массиве структур должен иметь смещение от начала этого массива кратное его размеру . А все остальное уже свистопляски вокруг этого правила. Вот и думайте как компилятор будет этого добиваться.
Иногда от этого правила отходят для long long и double.Ну не совсем так, это может зависеть от реализации. А вообще кроме sizeof есть еще и alignof
Ну есть и что, есть ещё и http://en.cppreference.com/w/cpp/types/alignment_of
От реализации компиляторов зависит только: или это по умолчанию обязательно делает для ускорения (x86), или это всегда обязательно делается, чтобы хотя бы работало (CUDA GPU).
...
Рейтинг: 0 / 0
03.09.2013, 13:30
    #38385359
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный sizeof объекта
Общее правило,

А кстати на каких платформах выравнивание бывает больше размера типа?
Я слышал что такие есть, но интересно конкретно на каких.
...
Рейтинг: 0 / 0
03.09.2013, 13:40
    #38385376
Странный sizeof объекта
Anatoly MoskovskyОбщее правило,

А кстати на каких платформах выравнивание бывает больше размера типа?
Я слышал что такие есть, но интересно конкретно на каких.
Что бы больше, не помню. Все-таки экономия памяти тоже не лишнее и для его объема, и для пропускной способности, и для вместимости кэша.

А из правила следуют два условия:
1) смещение элемента внутри структуры должно быть кратно размеру этого элемента;
2) размер структуры должен быть кратен наибольшему размеру элемента находящемуся в нем(исключения long long и double);
...
Рейтинг: 0 / 0
03.09.2013, 14:16
    #38385446
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный sizeof объекта
Общее правило2) размер структуры должен быть кратен наибольшему размеру элемента находящемуся в нем( исключения long long и double );
Под 64-битными виндой и линуксом - не исключения :)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Странный sizeof объекта / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]