Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/78: Рейтинг темы: голосов - 78, средняя оценка - 4.58
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255

оператор sizeof

28.04.2011, 23:53. Показов 14437. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!
Был сделан тест. Есть класс
C++
1
2
3
4
5
6
class A
{
int a;
char b;
double c;
};
В программе:
C++
1
2
A a;
cout<<sizeof(a)<<"\n";
При использовании MSVS 6.0 на экране: 16. Стоит 32х-разрядная Win7, т.е. в ответ: 4+1+8 = 13 байт.
Ещё один момент. При комментировании int a и double c, ответ 1, что правильно, после декомме-я int a, ответ 8. Почему всё происходит именно так. Есть варианты объяснений, что называется, без дальнейших вопросов?
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.04.2011, 23:53
Ответы с готовыми решениями:

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

Sizeof(.) или constexpr size_t tmp = sizeof(.)
sizeof(...) или constexpr size_t tmp = sizeof(...) Как лучше с точки зрения производительности? правильности?

Fwrite (buffer , sizeof(char), sizeof(buffer), pFile)
как записать часть массива чаров? допустим у нас arr; мне надо записать с позиции массива 500 до 600, 100 байтов как записать эту...

12
377 / 228 / 79
Регистрация: 24.11.2009
Сообщений: 695
28.04.2011, 23:58
байтовое выравнивание ??
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
29.04.2011, 00:01
Тут проявляется выравнивание - данные выравниваются по границам слова (размера типа int). В первом случае переменная с будет располагаться в памяти не непосредственно за переменной b, а будет отодвинута от неё на (sizeof(int) - sizeof(b)) байт. Вот и получается - a - 4 байта, b - один байт, 3 пустых байта - выравнивание, c - 8 байт, сумма - 16.
В остальных случаях - аналогично.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
29.04.2011, 12:23
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от silent_1991 Посмотреть сообщение
Тут проявляется выравнивание - данные выравниваются по границам слова (размера типа int).
Не совсем так. У каждого типа помимо размера есть ещё и праметр выравнивание. Для базовых типов (кроме, обычно, long double) как правило выравнивание совпадает с размером. Т.е. переменная типа int (размером 4 байта) в памяти лежит по адресу, кратному 4 (т.е. говорят, что выровнена на 4). То же мамое касается и полей структуры. В структуре поле типа double должно быть выровнено на 8, а потому после переменных int и char (в сумме занимающих 5 байт) появится дырка, чтобы смещение поля double было 8.

Выравнивание всей структуры совпадает с максимальным выравниванием среди полей. Размер структуры должен быть кратен выравниванию структуры (в противном случае массив из структур будет лежать в памяти криво). Т.е. если структура содержит в себе "double + char", то в конце структуры всё равно образуется дырка в 7 байт из-за того, что размер стуркутуры должен быть кратен 8 (т.е. выравниванию структуры, которое есть выравнивание double)

Есть специальные конструкции, для принудительной установки выравнивания типов или переменных, но пока тебе это не нужно
6
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
29.04.2011, 12:53  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Не совсем так. У каждого типа помимо размера есть ещё и праметр выравнивание. Для базовых типов (кроме, обычно, long double) как правило выравнивание совпадает с размером. Т.е. переменная типа int (размером 4 байта) в памяти лежит по адресу, кратному 4 (т.е. говорят, что выровнена на 4). То же мамое касается и полей структуры. В структуре поле типа double должно быть выровнено на 8, а потому после переменных int и char (в сумме занимающих 5 байт) появится дырка, чтобы смещение поля double было 8.

Выравнивание всей структуры совпадает с максимальным выравниванием среди полей. Размер структуры должен быть кратен выравниванию структуры (в противном случае массив из структур будет лежать в памяти криво). Т.е. если структура содержит в себе "double + char", то в конце структуры всё равно образуется дырка в 7 байт из-за того, что размер стуркутуры должен быть кратен 8 (т.е. выравниванию структуры, которое есть выравнивание double)

Есть специальные конструкции, для принудительной установки выравнивания типов или переменных, но пока тебе это не нужно
Вы упомянули "для базовых типов", а что, если имеется long double. Что тогда?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
29.04.2011, 13:01
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от alexsvk Посмотреть сообщение
а что, если имеется long double. Что тогда?
У long double зачастию выравнивание 8, а размер 12 или 16. В том смысле что у long double размер не совпадает с выравниванием. Настройка выравнивания зависит от программных соглашений (ABI) на архитектуре. Но в средней своей массе принято так, что выравнивание базового типа совпадает с размером, кроме long double, потому что он слишком большой и выравнивают его, как правило, по разному
3
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
29.04.2011, 13:42  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
У long double зачастию выравнивание 8, а размер 12 или 16. В том смысле что у long double размер не совпадает с выравниванием. Настройка выравнивания зависит от программных соглашений (ABI) на архитектуре. Но в средней своей массе принято так, что выравнивание базового типа совпадает с размером, кроме long double, потому что он слишком большой и выравнивают его, как правило, по разному
Сделал тест, оставив в классе лишь long double c. Размер оказался 8 байт.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
29.04.2011, 13:55
Цитата Сообщение от alexsvk Посмотреть сообщение
Сделал тест, оставив в классе лишь long double c. Размер оказался 8 байт.
Что за компилятор? Скорее всего он long double не поддерживает. Т.е. трактует его как double, что НЕ противоречит стандарту. На некоторых системах точно так же делают, потому что long double не такой уж и часто используемый тип, а его поддержка в аппаратуре - дело затратное (исходя из нечастой необходимости)

Добавлено через 3 минуты
А да, ты писал про MSVC 6.0. Там как раз такой случай: http://msdn.microsoft.com/en-u... 46459.aspx
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
29.04.2011, 13:56  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Что за компилятор? Скорее всего он long double не поддерживает. Т.е. трактует его как double, что НЕ противоречит стандарту. На некоторых системах точно так же делают, потому что long double не такой уж и часто используемый тип, а его поддержка в аппаратуре - дело затратное (исходя из нечастой необходимости)
Спасибо за ответ
Действительно, исключение для 6.0
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
29.04.2011, 14:05
Цитата Сообщение от alexsvk Посмотреть сообщение
Действительно, исключение для 6.0
Я бы не называл это исключение. MSVC-6.0 далеко не единственный компилятор, которы настроен что long double = double. И не только под intel'овскую архитектуру
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
29.04.2011, 15:27
На самом деле, всё немного сложнее. Например, вот два класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class С1
{
    int i;
    double d;
    char c;
};
 
class С2
{
    double d;
    int i;
    char c;
};
Размер первого = 24 байта, второго = 16 байт. Т.е. важен ещё и порядок, в котором расположены поля, т.к. от этого сильно зависит выравнивание.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
29.04.2011, 15:34
Цитата Сообщение от Deviaphan Посмотреть сообщение
Т.е. важен ещё и порядок, в котором расположены поля
Это вытекает из того, что каждое поле должно быть выровнено на параметр выравнивания своего типа. А потому ничего тут дополнительно сложного нет
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
29.04.2011, 15:45
Цитата Сообщение от Evg Посмотреть сообщение
дополнительно сложного нет
Дополнительно сложно то, что размер структуры зависит от порядка полей. Но в принципе да, масло-масляное говорю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.04.2011, 15:45
Помогаю со студенческими работами здесь

sizeof( char * ) & sizeof(char)
Здравствуйте, не могу понять почему sizeof(char *) = 4 а sizeof(char) = 1. Ну с последним ясно , а вот с первым непойму... Может кто-то...

sizeof()
Ребята,объясните пожалуйста для чего нужен sizeof()?А то в книге очень заумно написано...

sizeof
Подскажите пожалуйста что делаю не так? в базовом классе gameElement, имеется матрица указателей на базовый класс: gameElement* arr; ...

Sizeof
int a = { 1, 2, 3, 4 },n = sizeof(a) / sizeof(a); Битый час разбираюсь с этой строкой,но понять не могу. Мы делим массив...

sizeof (double)
в моём компиляторе sizeof( double ) == 8. Тогда почему #include &lt;iostream.h&gt; int main(){ double L=0x123456789L; ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru