powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Странный sizeof объекта
25 сообщений из 25, страница 1 из 1
Странный sizeof объекта
    #38384497
TimeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
Странный sizeof объекта
    #38384519
3 3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
3 3
Гость
Как что:
вывод3 3
http://ideone.com/vyVCfN
...
Рейтинг: 0 / 0
Странный sizeof объекта
    #38384538
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeCoderКак вы думаете, что будет на экране?:-) У меня только один вопрос: ПОЧЕМУ так?
Вообще, стандартом не описано какие конкретно размеры у short и char.
Так что зависит от платформы.
Кроме того выравнивание тоже зависит от платформы и компилятора.

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

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

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

У char как раз размер определен. 1 байт.
А вот у структуры, содержащей 3 char — уже нет.
...
Рейтинг: 0 / 0
Странный sizeof объекта
    #38384628
TimeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня в MS VS2012 выводится 4 и 3. Почему во втором случае не произошло выравнивания?
...
Рейтинг: 0 / 0
Странный sizeof объекта
    #38384637
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivУ char как раз размер определен. 1 байт.
Да, про char это я забыл.
...
Рейтинг: 0 / 0
Странный sizeof объекта
    #38384638
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeCoderУ меня в MS VS2012 выводится 4 и 3. Почему во втором случае не произошло выравнивания?
Потому что на x86 выравнивание char - 1
...
Рейтинг: 0 / 0
Странный sizeof объекта
    #38384652
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyПотому что на x86 выравнивание char - 1
Тогда почему у первой структуры размер 4? Я бы понял, если бы он был 5 или 3, но 4?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Странный sizeof объекта
    #38384660
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Странный sizeof объекта
    #38384669
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЯ бы понял, если бы он был 5 или 3, но 4?..
Размер структур всегда кратен степени двойки (если не играться с pragma pack), потому что на большинстве платформ скорость доступа таким структурам больше.
...
Рейтинг: 0 / 0
Странный sizeof объекта
    #38384671
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyРазмер структур всегда кратен степени двойки (если не играться с pragma pack), потому что на большинстве платформ скорость доступа таким структурам больше.
А, ну кроме структур состоящих только из char :)
...
Рейтинг: 0 / 0
Странный sizeof объекта
    #38384679
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyРазмер структур всегда кратен степени двойки

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

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

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

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

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

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

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

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

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

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

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


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