Проблема со struct
От: Evgeniy13 Россия  
Дата: 26.06.04 15:42
Оценка:
Здавствуйте. Не мог бы кто-нибудь подсказать, что здесь не так...

struct T
{
    enum E { A = 0, B, C, D };
    E a        : 2;
    E b        : 2;
    E c        : 2;
    E d        : 2;
};

int main()
{
    cout << sizeof(T) << endl;
    return 0;
}


Выводит 4
Хотя достаточно одного байта...
Не все в этом мире можно выразить с помощью нулей и единиц...
Re: Проблема со struct
От: Кодт Россия  
Дата: 26.06.04 19:42
Оценка:
Здравствуйте, Evgeniy13, Вы писали:

E>Здавствуйте. Не мог бы кто-нибудь подсказать, что здесь не так...


E> enum E { A = 0, B, C, D };


E>Выводит 4

E>Хотя достаточно одного байта...

Если вместо enum брать char, short, int/long, __int64 -- то получим 1, 2, 4, 8 соответственно.
Видимо, это компилятор (VC7) подбирает размер так, чтобы вписать тип полей в габариты структуры.
... << RSDN@Home 1.1.2 stable >>
Перекуём баги на фичи!
Re[2]: Проблема со struct
От: Evgeniy13 Россия  
Дата: 28.06.04 10:30
Оценка:
Здравствуйте, Кодт, Вы писали:

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


E>>Здавствуйте. Не мог бы кто-нибудь подсказать, что здесь не так...


E>> enum E { A = 0, B, C, D };


E>>Выводит 4

E>>Хотя достаточно одного байта...

К>Если вместо enum брать char, short, int/long, __int64 -- то получим 1, 2, 4, 8 соответственно.

К>Видимо, это компилятор (VC7) подбирает размер так, чтобы вписать тип полей в габариты структуры.
Но тогда бы структура должна была быть больше чем 4. В зависимости от выравнивания.
Ерунда какая-то. Неужели никто этим не пользуется..?
Не все в этом мире можно выразить с помощью нулей и единиц...
Re[2]: Проблема со struct
От: LaptevVV Россия  
Дата: 28.06.04 10:42
Оценка:
Здравствуйте, Кодт, Вы писали:

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


E>>Здавствуйте. Не мог бы кто-нибудь подсказать, что здесь не так...


E>> enum E { A = 0, B, C, D };


E>>Выводит 4

E>>Хотя достаточно одного байта...

К>Если вместо enum брать char, short, int/long, __int64 -- то получим 1, 2, 4, 8 соответственно.

К>Видимо, это компилятор (VC7) подбирает размер так, чтобы вписать тип полей в габариты структуры.
enum по умолчанию = int, а это в VC7 4 байта
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Проблема со struct
От: LaptevVV Россия  
Дата: 28.06.04 10:43
Оценка:
Здравствуйте, Evgeniy13, Вы писали:

E>>>Здавствуйте. Не мог бы кто-нибудь подсказать, что здесь не так...


E>>> enum E { A = 0, B, C, D };


E>>>Выводит 4

E>>>Хотя достаточно одного байта...

К>>Если вместо enum брать char, short, int/long, __int64 -- то получим 1, 2, 4, 8 соответственно.

К>>Видимо, это компилятор (VC7) подбирает размер так, чтобы вписать тип полей в габариты структуры.
E>Но тогда бы структура должна была быть больше чем 4. В зависимости от выравнивания.
E>Ерунда какая-то. Неужели никто этим не пользуется..?
Попробуй использовать прагму для выравнивания
#pragma pack(1)
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Проблема со struct
От: Evgeniy13 Россия  
Дата: 28.06.04 11:17
Оценка: -1
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, Кодт, Вы писали:


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


E>>>Здавствуйте. Не мог бы кто-нибудь подсказать, что здесь не так...


E>>> enum E { A = 0, B, C, D };


E>>>Выводит 4

E>>>Хотя достаточно одного байта...

К>>Если вместо enum брать char, short, int/long, __int64 -- то получим 1, 2, 4, 8 соответственно.

К>>Видимо, это компилятор (VC7) подбирает размер так, чтобы вписать тип полей в габариты структуры.
LVV>enum по умолчанию = int, а это в VC7 4 байта

Ну и что? Неужели не понятно... Для битового поля достаточно один байт. Какая разница, какой тип. bool тоже один байт. Я считаю это бага. Битовые поля это мегафича, а пользоваться ей не получается. Другое дело, что я чего-то не так делаю. Но я не пойму, что не так. Какое ограничение на типы в VC?
Не все в этом мире можно выразить с помощью нулей и единиц...
Re[4]: Проблема со struct
От: Evgeniy13 Россия  
Дата: 28.06.04 11:18
Оценка:
Здравствуйте, LaptevVV, Вы писали:

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


E>>>>Здавствуйте. Не мог бы кто-нибудь подсказать, что здесь не так...


E>>>> enum E { A = 0, B, C, D };


E>>>>Выводит 4

E>>>>Хотя достаточно одного байта...

К>>>Если вместо enum брать char, short, int/long, __int64 -- то получим 1, 2, 4, 8 соответственно.

К>>>Видимо, это компилятор (VC7) подбирает размер так, чтобы вписать тип полей в габариты структуры.
E>>Но тогда бы структура должна была быть больше чем 4. В зависимости от выравнивания.
E>>Ерунда какая-то. Неужели никто этим не пользуется..?
LVV>Попробуй использовать прагму для выравнивания
LVV>#pragma pack(1)

Писал. Можешь сам попробовать, это совсем из другой оперы.
Не все в этом мире можно выразить с помощью нулей и единиц...
Re[4]: Проблема со struct
От: LaptevVV Россия  
Дата: 28.06.04 11:19
Оценка:
Здравствуйте, Evgeniy13, Вы писали:

E>>>> enum E { A = 0, B, C, D };


E>>>>Выводит 4

E>>>>Хотя достаточно одного байта...

К>>>Если вместо enum брать char, short, int/long, __int64 -- то получим 1, 2, 4, 8 соответственно.

К>>>Видимо, это компилятор (VC7) подбирает размер так, чтобы вписать тип полей в габариты структуры.
LVV>>enum по умолчанию = int, а это в VC7 4 байта

E>Ну и что? Неужели не понятно... Для битового поля достаточно один байт. Какая разница, какой тип. bool тоже один байт. Я считаю это бага. Битовые поля это мегафича, а пользоваться ей не получается. Другое дело, что я чего-то не так делаю. Но я не пойму, что не так. Какое ограничение на типы в VC?

Это не в VC а в С++.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Проблема со struct
От: Кодт Россия  
Дата: 28.06.04 11:24
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Попробуй использовать прагму для выравнивания

LVV>#pragma pack(1)

От прагмы это не зависит.
Перекуём баги на фичи!
Re[5]: Проблема со struct
От: Evgeniy13 Россия  
Дата: 28.06.04 11:31
Оценка: -1
Здравствуйте, LaptevVV, Вы писали:

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


E>>>>> enum E { A = 0, B, C, D };


E>>>>>Выводит 4

E>>>>>Хотя достаточно одного байта...

К>>>>Если вместо enum брать char, short, int/long, __int64 -- то получим 1, 2, 4, 8 соответственно.

К>>>>Видимо, это компилятор (VC7) подбирает размер так, чтобы вписать тип полей в габариты структуры.
LVV>>>enum по умолчанию = int, а это в VC7 4 байта

E>>Ну и что? Неужели не понятно... Для битового поля достаточно один байт. Какая разница, какой тип. bool тоже один байт. Я считаю это бага. Битовые поля это мегафича, а пользоваться ей не получается. Другое дело, что я чего-то не так делаю. Но я не пойму, что не так. Какое ограничение на типы в VC?

LVV>Это не в VC а в С++.

Что в C++? Когда нужно один подсовывать четыре байта?
Не все в этом мире можно выразить с помощью нулей и единиц...
Re[6]: Проблема со struct
От: Evgeniy13 Россия  
Дата: 28.06.04 11:38
Оценка:
Здравствуйте, Evgeniy13, Вы писали:

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


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


E>>>>>> enum E { A = 0, B, C, D };


E>>>>>>Выводит 4

E>>>>>>Хотя достаточно одного байта...

К>>>>>Если вместо enum брать char, short, int/long, __int64 -- то получим 1, 2, 4, 8 соответственно.

К>>>>>Видимо, это компилятор (VC7) подбирает размер так, чтобы вписать тип полей в габариты структуры.
LVV>>>>enum по умолчанию = int, а это в VC7 4 байта

E>>>Ну и что? Неужели не понятно... Для битового поля достаточно один байт. Какая разница, какой тип. bool тоже один байт. Я считаю это бага. Битовые поля это мегафича, а пользоваться ей не получается. Другое дело, что я чего-то не так делаю. Но я не пойму, что не так. Какое ограничение на типы в VC?

LVV>>Это не в VC а в С++.

E>Что в C++? Когда нужно один подсовывать четыре байта?


Вот мне поставили два минуса. Может объяснят тогда в чем я не прав? Все правильно, что размер 4?
Не все в этом мире можно выразить с помощью нулей и единиц...
Re[6]: Проблема со struct
От: Кодт Россия  
Дата: 28.06.04 11:38
Оценка:
Здравствуйте, Evgeniy13, Вы писали:

E>>>Ну и что? Неужели не понятно... Для битового поля достаточно один байт. Какая разница, какой тип. bool тоже один байт. Я считаю это бага. Битовые поля это мегафича, а пользоваться ей не получается. Другое дело, что я чего-то не так делаю. Но я не пойму, что не так. Какое ограничение на типы в VC?

LVV>>Это не в VC а в С++.

E>Что в C++? Когда нужно один подсовывать четыре байта?


Кстати говоря, для Комо (www.nixie.narod.ru/comeau) вообще плевать на тип поля.
struct B { char a:2, b:2, c:2, d:2; };

#define STATIC_ASSERT(v) { typedef char n[(v) ? 10 : -10]; }

int main()
{
  STATIC_ASSERT(sizeof(B) == 4);
}
Перекуём баги на фичи!
Re[4]: Проблема со struct
От: MShura  
Дата: 28.06.04 11:38
Оценка:
К>>>Если вместо enum брать char, short, int/long, __int64 -- то получим 1, 2, 4, 8 соответственно.
К>>>Видимо, это компилятор (VC7) подбирает размер так, чтобы вписать тип полей в габариты структуры.
LVV>>enum по умолчанию = int, а это в VC7 4 байта

E>Ну и что? Неужели не понятно...


Как раз все понятно. Поскольку в VC enum всегда int, то твой код эквивалентен

struct T
{
    int a        : 2;
    int b        : 2;
    int c        : 2;
    int d        : 2;
};

Отсюда автоматически следует размер структуры 4 байта (на IA32).

Если хочешь чтобы было 1 байт, то пиши явно char вместо неявного int (или переходи на другой компилятор).
P.S.
Другие компиляторы "более умные" и используют для enum минимальное возможное из char,short,int. Это также может приводить к проблеме "идентичности" структур в разных компиляторах. Обычно такое поведение управляется ключами компиляции, однако чтобы от этого не зависеть мы всегда в enum пишем фиктивное поле с явным значением UINT_MAX.
Re[5]: Проблема со struct
От: Evgeniy13 Россия  
Дата: 28.06.04 11:45
Оценка:
Здравствуйте, MShura, Вы писали:

К>>>>Если вместо enum брать char, short, int/long, __int64 -- то получим 1, 2, 4, 8 соответственно.

К>>>>Видимо, это компилятор (VC7) подбирает размер так, чтобы вписать тип полей в габариты структуры.
LVV>>>enum по умолчанию = int, а это в VC7 4 байта

E>>Ну и что? Неужели не понятно...


MS>Как раз все понятно. Поскольку в VC enum всегда int, то твой код эквивалентен


MS>
MS>struct T
MS>{
MS>    int a        : 2;
MS>    int b        : 2;
MS>    int c        : 2;
MS>    int d        : 2;
MS>};
MS>

MS>Отсюда автоматически следует размер структуры 4 байта (на IA32).

MS>Если хочешь чтобы было 1 байт, то пиши явно char вместо неявного int (или переходи на другой компилятор).

MS>P.S.
MS>Другие компиляторы "более умные" и используют для enum минимальное возможное из char,short,int. Это также может приводить к проблеме "идентичности" структур в разных компиляторах. Обычно такое поведение управляется ключами компиляции, однако чтобы от этого не зависеть мы всегда в enum пишем фиктивное поле с явным значением UINT_MAX.

Я знаю, что размер enum четыре байта в VC7. Я хотел в свое структре использовать enum и потому его и написал. Почему четыре байта? Если компилятор делает столько полей, чтобы нельзя было вылезти за границу числа, то тогда размер должен быть еще больше.
Не все в этом мире можно выразить с помощью нулей и единиц...
Re[6]: Проблема со struct
От: MShura  
Дата: 28.06.04 12:01
Оценка:
E>Я знаю, что размер enum четыре байта в VC7. Я хотел в свое структре использовать enum и потому его и написал. Почему четыре байта? Если компилятор делает столько полей, чтобы нельзя было вылезти за границу числа, то тогда размер должен быть еще больше.

Смею предположить, что почти каждое MS приложение сохраняет свои данные на диске.
Если в записанной на диск структуре есть поле типа enum, то получается, что layout структуры будет зависеть от полей enum.
Пример

enum B{ b = 0,c=1, };

struct A{
  B b;
}


Следующая версия приложения расширила enum B так:

enum B{ b=0,c=1,d=256}


В итоге если бы размер enum был не int то было бы плохо.
Re[7]: Проблема со struct
От: Evgeniy13 Россия  
Дата: 28.06.04 12:05
Оценка:
Здравствуйте, MShura, Вы писали:

E>>Я знаю, что размер enum четыре байта в VC7. Я хотел в свое структре использовать enum и потому его и написал. Почему четыре байта? Если компилятор делает столько полей, чтобы нельзя было вылезти за границу числа, то тогда размер должен быть еще больше.


MS>Смею предположить, что почти каждое MS приложение сохраняет свои данные на диске.

MS>Если в записанной на диск структуре есть поле типа enum, то получается, что layout структуры будет зависеть от полей enum.
MS>Пример

MS>
MS>enum B{ b = 0,c=1, };

MS>struct A{
MS>  B b;
MS>}
MS>


MS>Следующая версия приложения расширила enum B так:


MS>
MS>enum B{ b=0,c=1,d=256}
MS>


MS>В итоге если бы размер enum был не int то было бы плохо.


Это мне ответ или нет? Я разве говорил, что плохо, что enum 4 байта?
Я задал вопрос про битовые поля.
Не все в этом мире можно выразить с помощью нулей и единиц...
Re[7]: Проблема со struct
От: Кодт Россия  
Дата: 28.06.04 12:14
Оценка:
Здравствуйте, MShura, Вы писали:

MS>В итоге если бы размер enum был не int то было бы плохо.


Проблема поддержки версий, и прямизны рук программиста.
По-хорошему, нужно было делать несколько вариантов энума и структуры, и, распознавая версию файла, пользоваться разными типами.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.