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

C++

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

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

20.01.2014, 18:53. Просмотров 2951. Ответов 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++
Суть вопроса в том, что имея два шаблона класса, унаследованных от общего предка, и инстанциируя &quot;один другим&quot; имеем + n байт к размеру...

Предельный размер списка типа vector - C++ Builder
В программе возникает ошибка, которую не могу понять. Есть двухмерный массив данных std::vector&lt;std::vector&lt;int&gt; &gt; myvector; Я его...

Определите размер структурного типа.Мотивируйте свой ответ - C++
struct{ short p:12; long double y; int x; char z; int m:7; int e:20; }mystruct; Привет всем,помогите с задачкой

Определите размер структурного типа(с++).Мотивируйте свой ответ - C++
struct{ double**y; union{ double u; long v; char e; }un; char z; int x:10; int k:6;

Sizeof: как правильно найти размер авторского типа? - C++
#include &lt;stdio.h&gt; using namespace std; class kl { }; ///////////////////////////////////////

'Какой размер имеет переменная типа int в 32 битной и в 64 битной OC? - C++
Объектно-ориентированное программирование в С++ Р. Лафоре.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 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Эксперт С++
6996 / 4167 / 594
Регистрация: 29.11.2010
Сообщений: 11,047
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Эксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 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
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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Эксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
20.01.2014, 21:29     Размер типа #6
Цитата Сообщение от Tulosba Посмотреть сообщение
Но размер-то от объемлющей структуры берется, а не от самого массива.
просто тип считается не завершенным
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
20.01.2014, 21:36  [ТС]     Размер типа #7
Цитата Сообщение от Croessmah Посмотреть сообщение
просто тип считается не завершенным
Это откуда следует? Для незавершенного типа sizeof выполнить нельзя.
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
20.01.2014, 21:46     Размер типа #8
Цитата Сообщение от Tulosba Посмотреть сообщение
Это откуда следует?
ссылка и цитата в посте #2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2014, 22:43     Размер типа
Еще ссылки по теме:

Каков размер типа int на 64-битном и 32-битном Windows? - C++
Тип int на 32 битном Windows занимает 32 бита(4 байта) так? А на 64 битном 64 бита(8 байт) да?

Ввести размер массива с клавиатуры и передать этот размер в конструктор - C++
Я создал массив объектов. И я хочу ввести размер этого массива с клавиатуры, и передать этот размер в конструктор, как мне это сделать? ...

Изменять размер панели под размер причаливаемых окон - C++ Builder
Имеется панель, которая выравнена относительно главного окна как alLeft. На панель причаливаются и отчаливаются другие окна фиксированного...

Запись информации из вектора типа string в вектор типа double - C++
Как записать только числа , которые хранятся в векторе типа стринг, в вектор типа дабл, в векторе типа стринг есть как буквы так и числа ,...


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

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

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