Re[2]: Размер в enum
От: Тот кто сидит в пруду Россия  
Дата: 05.11.09 07:22
Оценка: 7 (1)
Здравствуйте, Bell, Вы писали:

W>>Вот такая конструкция на моей системе работает корректно:

W>>
W>>template <int64 n>
W>>struct X
W>>{
W>>  enum { result = n };
W>>};
W>>


W>>Могу я ожидать, что в компиляторах, где sizeof(long long int) = 8 в result будет всегда попадать именно 8 байт, а не 4?


B>Да.


B>

B>7.2/5
B>The underlying type of an enumeration is an integral type that can represent all the enumerator values
B>defined in the enumeration. It is implementation-defined which integral type is used as the underlying type
B>for an enumeration except that the underlying type shall not be larger than int unless the value of an enumerator
B>cannot fit in an int or unsigned int.
B>...


В реальности VC 7, VC 8 и VC 9 этот пункт стандарта нарушают. У них даже ворнинг специальный на эту тему есть — C4341.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: Размер в enum
От: Caracrist https://1pwd.org/
Дата: 05.11.09 07:27
Оценка: :)
Здравствуйте, Wody, Вы писали:

W>Вот такая конструкция на моей системе работает корректно:

W>
W>template <int64 n>
W>struct X
W>{
W>  enum { result = n };
W>};
W>


W>Могу я ожидать, что в компиляторах, где sizeof(long long int) = 8 в result будет всегда попадать именно 8 байт, а не 4?


W>Спасибо



template <__int64 n>
struct X
{
    enum : __int64{ result = n };
};

~~~~~
~lol~~
~~~ Single Password Solution
Размер в enum
От: Wody  
Дата: 05.11.09 01:06
Оценка:
Вот такая конструкция на моей системе работает корректно:
template <int64 n>
struct X
{
  enum { result = n };
};


Могу я ожидать, что в компиляторах, где sizeof(long long int) = 8 в result будет всегда попадать именно 8 байт, а не 4?

Спасибо
Re: Размер в enum
От: Bell Россия  
Дата: 05.11.09 03:11
Оценка:
Здравствуйте, Wody, Вы писали:

W>Вот такая конструкция на моей системе работает корректно:

W>
W>template <int64 n>
W>struct X
W>{
W>  enum { result = n };
W>};
W>


W>Могу я ожидать, что в компиляторах, где sizeof(long long int) = 8 в result будет всегда попадать именно 8 байт, а не 4?


Да.

7.2/5
The underlying type of an enumeration is an integral type that can represent all the enumerator values
defined in the enumeration. It is implementation-defined which integral type is used as the underlying type
for an enumeration except that the underlying type shall not be larger than int unless the value of an enumerator
cannot fit in an int or unsigned int.
...

Любите книгу — источник знаний (с) М.Горький
Re[3]: Размер в enum
От: Wody  
Дата: 05.11.09 13:07
Оценка:
Спасибо, все понял
Re[2]: Размер в enum
От: dcb-BanDos Россия  
Дата: 08.11.09 13:28
Оценка:
Здравствуйте, Caracrist, Вы писали:


C>
C>template <__int64 n>
C>struct X
C>{
C>    enum : __int64{ result = n };
C>};
C>

C>

это все конечно хорошо, но попробуй теперь эту структуру сериализнуть с помощью boost::serialization
Ничто не ограничивает полет мысли программиста так, как компилятор.
Re[3]: Размер в enum
От: Caracrist https://1pwd.org/
Дата: 15.11.09 06:00
Оценка:
Здравствуйте, dcb-BanDos, Вы писали:

DB>Здравствуйте, Caracrist, Вы писали:



C>>
C>>template <__int64 n>
C>>struct X
C>>{
C>>    enum : __int64{ result = n };
C>>};
C>>

C>>

DB>это все конечно хорошо, но попробуй теперь эту структуру сериализнуть с помощью boost::serialization


Это типа структура виновата?
~~~~~
~lol~~
~~~ Single Password Solution
Re[2]: Размер в enum
От: uzhas Ниоткуда  
Дата: 15.11.09 20:25
Оценка:
W>>
W>>template <int64 n>
W>>struct X
W>>{
W>>  enum { result = n };
W>>};
W>>


W>>Могу я ожидать, что в компиляторах, где sizeof(long long int) = 8 в result будет всегда попадать именно 8 байт, а не 4?


B>Да.


B>

B>7.2/5
B>The underlying type of an enumeration is an integral type that can represent all the enumerator values
B>defined in the enumeration. It is implementation-defined which integral type is used as the underlying type
B>for an enumeration except that the underlying type shall not be larger than int unless the value of an enumerator
B>cannot fit in an int or unsigned int.
B>...


Откуда следует, что в X<15>::result будет 8 байт? Мне кажется, что там будет <= sizeof(int) на основании процитированного 7.2/5.
Re[3]: Размер в enum
От: Bell Россия  
Дата: 16.11.09 03:13
Оценка:
Здравствуйте, uzhas, Вы писали:

B>>

B>>7.2/5
B>>The underlying type of an enumeration is an integral type that can represent all the enumerator values
B>>defined in the enumeration. It is implementation-defined which integral type is used as the underlying type
B>>for an enumeration except that the underlying type shall not be larger than int unless the value of an enumerator
B>>cannot fit in an int or unsigned int.
B>>...


U>Откуда следует, что в X<15>::result будет 8 байт?

Этого никто не утверждал

U>Мне кажется, что там будет <= sizeof(int) на основании процитированного 7.2/5.

В данном случае именно так — ведь внутренний тип перечисления определяется исходя из значений элементов перечисления.
Любите книгу — источник знаний (с) М.Горький
Re[4]: Размер в enum
От: uzhas Ниоткуда  
Дата: 18.11.09 20:14
Оценка:
B>Этого никто не утверждал
Виноват =\
А что же тогда означает слово "Да"? Или я вопрос не понял.

W>>Могу я ожидать, что в компиляторах, где sizeof(long long int) = 8 в result будет всегда попадать именно 8 байт, а не 4?


B>Да.
Re[5]: Размер в enum
От: Bell Россия  
Дата: 19.11.09 03:00
Оценка:
Здравствуйте, uzhas, Вы писали:

B>>Этого никто не утверждал

U>Виноват =\
U>А что же тогда означает слово "Да"? Или я вопрос не понял.

W>>>Могу я ожидать, что в компиляторах, где sizeof(long long int) = 8 в result будет всегда попадать именно 8 байт, а не 4?


B>>Да.


Я понял вопрос следующим образом: влезет ли в result значение, не представимое интегральным типом с размером 4 байта (int на многих платформах). Стандарт говорит, что в зависимости от значений перечисления будет использоваться тот тип, который позволит отобразить все эти значения.

Вот пример для иллюстрации:

template <long long n>
struct X
{
  enum { result = n };
};

int main()
{
   int arr1[sizeof(long long) == 8 ? 1 : -1] = {0};//Ok, тип long long имеет размер 8
   int arr2[sizeof(X<15>::result) == 8 ? 1 : -1] = {0};//Error - значение 15 представимо в int, и внутренним типом перечисления выбирается int
   int arr3[sizeof(X<15>::result) == 4 ? 1 : -1] = {0};//Ok

   const long long ll = 1024*1024;
   int arr4[sizeof(X<ll*ll>::result) == 8 ? 1 : -1] = {0};//Ok а вот тут уже внутренний тип перечисления - это long long
   return 0;
}


Компилятор — Comeau.
Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.