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

Поясните результат работы программы - C++

Восстановить пароль Регистрация
 
ПростоЯ
184 / 101 / 1
Регистрация: 30.05.2009
Сообщений: 746
25.03.2013, 16:44     Поясните результат работы программы #1
Поясните, пожалуйста, результат следующей программы:
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
struct A {
char a;
int b;
char c;
};
int main() {
std::cout << sizeof(A);
}
В итоге на экран выводится цифра 12. Почему?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fjay69
 Аватар для fjay69
85 / 85 / 1
Регистрация: 26.10.2012
Сообщений: 248
25.03.2013, 16:51     Поясните результат работы программы #2
Это особенности размещения данных в памяти. По умолчанию, данные раскидываются в кластеры по 4 байта. То есть вышеприведённая структура будет выглядеть в памяти так:
C000IIIIC000, где C - char (1 байт), IIII - int (4 байта), 0 - пустой байт
Но если написать вот так:
C++
1
2
3
4
5
6
7
#pragma pack (push, 1)
struct A {
char a;
int b;
char c;
};
#pragma pack (pop)
данные разместятся так: CIIIIC
И тогда sizeof выдаст 6, как и положено.
ПростоЯ
184 / 101 / 1
Регистрация: 30.05.2009
Сообщений: 746
25.03.2013, 16:59  [ТС]     Поясните результат работы программы #3
Цитата Сообщение от fjay69 Посмотреть сообщение
И тогда sizeof выдаст 6, как и положено.
но выводится же 12, а не 6
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.03.2013, 17:07     Поясните результат работы программы #4
http://www.kalinin.ru/programming/cpp/31_07_00.shtml
http://habrahabr.ru/post/142662/
Использование #pragma pack(push,1)... pack(pop)
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
25.03.2013, 17:19     Поясните результат работы программы #5
Цитата Сообщение от ПростоЯ Посмотреть сообщение
но выводится же 12, а не 6
Директива #pragma есть implementation-defined, и если препроцессор компилятора не поддерживает ее, то то, что следует после pragma, он молча проглотит ничего не сделав.
Поэтому при использовании #pragma следует указывать компилятор (чего в статье на хабре кстати не сделано)).

в gcc можно сделать так
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
struct A {
char a;
int b;
char c;
}__attribute__((aligned(1),packed));
 
int main() {
std::cout << sizeof(A);
}
вывод 6.

Добавлено через 4 минуты
ну и для полноты поста, цитата из стандарта
16.6 Pragma directive

A preprocessing directive of the form
# pragma pp-tokensopt new-line
causes the implementation to behave in an implementation-defined manner. Any pragma that is not recog-
nized by the implementation is ignored.
Yandex
Объявления
25.03.2013, 17:19     Поясните результат работы программы
Ответ Создать тему
Опции темы

Текущее время: 13:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru