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

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.92
Tulosba
:)
Эксперт С++
4387 / 3230 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
#1

Размер типа - C++

20.01.2014, 18:53. Просмотров 2938. Ответов 8
Метки нет (Все метки)

Такой небольшой занимательный код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
struct S1
{
};
 
struct S2
{
    int a[0];
};
 
int main() {
 
    std::cout << sizeof(S1) << std::endl;
    std::cout << sizeof(S2) << std::endl;
 
    return 0;
}
Сначала попробуйте догадаться какой будет вывод.

Кликните здесь для просмотра всего текста


Ну а потом, хотелось бы понять, почему так и зачем?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2014, 18:53     Размер типа
Посмотрите здесь:

C++ размер типа bool
C++ Builder Какой приблизительно размер добавляемого компонента и влияет ли он на размер самой программы
C++ Шаблоны, наследование и размер типа
C++ Builder Изменять размер панели под размер причаливаемых окон
Аргумент типа WCHAR* не совместим с параметром типа const char* C++
Sizeof: как правильно найти размер авторского типа? C++
Можно ли присвоить объекту основного типа значение объекта пользовательского типа? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12674 / 7182 / 801
Регистрация: 27.09.2012
Сообщений: 17,708
Записей в блоге: 2
Завершенные тесты: 1
20.01.2014, 20:00     Размер типа #2
Не понятно почему у S2 размер 0...

в GCC всякой фигни напихали

http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html(ссыль от 0x10)
Flexible array members have incomplete type, and so the sizeof operator may not be applied. As a quirk of the original implementation of zero-length arrays, sizeof evaluates to zero.
Добавлено через 43 секунды
-pedantic -pedantic-errors рулят
MrGluck
Ворчун
Эксперт CЭксперт С++
6414 / 3612 / 448
Регистрация: 29.11.2010
Сообщений: 9,531
20.01.2014, 20:12     Размер типа #3
Я думаю все из-за того, что начало и конец массива, то бишь begin() и end() совпадают.
23.3.2.8 Zero sized arrays
1 array shall provide support for the special case N == 0.
2 In the case that N == 0, begin() == end() == unique value. The return value of data() is unspecified.
Добавлено через 4 минуты
Смотрим далее:
5.3.3 Sizeof
2 When applied to a reference or a reference type, the result is the size of the referenced type. When applied
to a class, the result is the number of bytes in an object of that class including any padding required for
placing objects of that type in an array.
The size of a most derived class shall be greater than zero (1.8).
The result of applying sizeof to a base class subobject is the size of the base class type. When applied
to an array, the result is the total number of bytes in the array. This implies that the size of an array of n
elements is n times the size of an element.
Добавлено через 2 минуты
Думаю насчет sizeof 1 структуры вопросов ни у кого не возникало?)
Croessmah
Модератор
Эксперт CЭксперт С++
12674 / 7182 / 801
Регистрация: 27.09.2012
Сообщений: 17,708
Записей в блоге: 2
Завершенные тесты: 1
20.01.2014, 20:25     Размер типа #4
23.3.2.8 Zero sized arrays
э то ж глава про std::array

Думаю, достаточно этого:
8.3.4 Arrays
D1 [ constant-expressionopt ] attribute-specifier-seqopt
and the type of the identifier in the declaration T D1 is “derived-declarator-type-list T”, then the type of the identifier of D is an array type; if the type of the identifier of D contains the auto type-specifier, the program is ill-formed. T is called the array element type; this type shall not be a reference type, the (possibly cv-qualified) type void, a function type or an abstract class type. If the constant-expression (5.19) is present, it shall be an integral constant expression and its value shall be greater than zero.
Tulosba
:)
Эксперт С++
4387 / 3230 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.01.2014, 21:23  [ТС]     Размер типа #5
Цитата Сообщение от Croessmah Посмотреть сообщение
If the constant-expression (5.19) is present, it shall be an integral constant expression and its value shall be greater than zero.
Очередное творение GNU стало быть.
Проверил в студии, получил:
1
1
и предупреждение:
warning C4200: nonstandard extension used : zero-sized array in struct/union
Цитата Сообщение от MrGluck Посмотреть сообщение
Я думаю все из-за того, что начало и конец массива, то бишь begin() и end() совпадают.
Но размер-то от объемлющей структуры берется, а не от самого массива.
Croessmah
Модератор
Эксперт CЭксперт С++
12674 / 7182 / 801
Регистрация: 27.09.2012
Сообщений: 17,708
Записей в блоге: 2
Завершенные тесты: 1
20.01.2014, 21:29     Размер типа #6
Цитата Сообщение от Tulosba Посмотреть сообщение
Но размер-то от объемлющей структуры берется, а не от самого массива.
просто тип считается не завершенным
Tulosba
:)
Эксперт С++
4387 / 3230 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.01.2014, 21:36  [ТС]     Размер типа #7
Цитата Сообщение от Croessmah Посмотреть сообщение
просто тип считается не завершенным
Это откуда следует? Для незавершенного типа sizeof выполнить нельзя.
Croessmah
Модератор
Эксперт CЭксперт С++
12674 / 7182 / 801
Регистрация: 27.09.2012
Сообщений: 17,708
Записей в блоге: 2
Завершенные тесты: 1
20.01.2014, 21:46     Размер типа #8
Цитата Сообщение от Tulosba Посмотреть сообщение
Это откуда следует?
ссылка и цитата в посте #2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2014, 22:43     Размер типа
Еще ссылки по теме:

'Какой размер имеет переменная типа int в 32 битной и в 64 битной OC? C++
Определите размер структурного типа(с++).Мотивируйте свой ответ C++
Определите размер структурного типа.Мотивируйте свой ответ C++
Предельный размер списка типа vector C++ Builder
C++ Каков размер типа int на 64-битном и 32-битном Windows?

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4387 / 3230 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.01.2014, 22:43  [ТС]     Размер типа #9
Цитата Сообщение от Croessmah Посмотреть сообщение
ссылка и цитата в посте #2
"Flexible array members" != "Zero-length arrays".
Yandex
Объявления
20.01.2014, 22:43     Размер типа
Ответ Создать тему
Опции темы

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