Войти
ПрограммированиеФорумОбщее

Различные резлультаты sizeof для одного класса

Страницы: 1 2 Следующая »
#0
19:33, 21 сен. 2014

В общем такой есть класс

class TE4GameConstructionNetworkNode
{
  friend TE4GameLoader;

  friend TE4GameConstructionSystem;

protected:

// ИГРОВЫЕ ДАННЫЕ

  // узел или линия
  // если линия, то позиция не используется, а проверются две точки соседних узлов
  bool  m_bNodeOrLine;

  // позиция в локальной системе объекта
  D3DXVECTOR3  m_v3Position;
  // позиция в локальной системе части
  D3DXVECTOR3  m_v3PositionLocal;

  // нормальное состояние [единицы состояния]
  float  m_fConditionMax;
  // максимальная степень ремонта части [0;1]
  float  m_fRepairProportionMax;

  // параметры сопротивления повреждению (в какой степени воздействие повреждает материал относительно эталона)
  float  m_fInfluenceResistance[TE4_GAME_CONSTRUCT_INFLUENCES_COUNT];

// ФЛАГИ УПРАВЛЕНИЯ

  // работоспособность зависит от проходимости части
  bool  m_bOperabilityFromPartPassability;

// ПЕРЕМЕННЫЕ ДАННЫЕ

  // текущее состояние [единицы состояния]
  float  m_fConditionCur;
  // текущее значение ремонта [единицы состояния]
  float  m_fRepairCur;

  // список контактов с субстанциями
  bool  m_fSubstanceContactInside[TE4_GAME_CONSTRUCT_SUBSTANCES_COUNT];

  // флаг работоспособности (включение / выключение)
  bool  m_bEnable;
  // флаг выключения работоспособности
  bool  m_bOperability;

// ПРОХОДИМОСТЬ ПУТЕПРОВОДОВ

  // узел сети может быть связан с дверным проходом, тогда он влияет на эффективность работы системы
  UINT  m_uObjectDoorID;

// ИЕРАРХИЯ

  // родительская система
  UINT  m_uParentNetworkID;
  // родительская часть
  UINT  m_uParentPartID;

// ПОИСК ПУТИ
  
  // флаг указывает на то, что путь надо искать по умолчанию через этот узел
  bool  m_bMainPathNode;

  // список узлов соседей (номера в родителе)
  UINT  m_aNeighborsNodes[TE4_GAME_CONSTRUCTION_NETWORK_MAX_NODES_NEIGHBORS];
  // количество соседей
  size_t  m_sNeighborsCount;

  // временный список поиска пути
  std::vector<UINT>  m_stdvPathNodes;
  // рабочая итерация поиска
  UINT        m_uPathIterationID;

public:

// ПОЛУЧЕНИЕ ДАННЫХ

  // получить сопротивляемость повреждению по ID
  float  GetInfluenceResitance( UINT InflienceID );
  // получить сопротивляемость повреждению по ID
  bool  GetSubstanceContactInside( UINT SubstanceID );


public:

  TE4GameConstructionNetworkNode();
  ~TE4GameConstructionNetworkNode();
};

const size_t c_sTE4GameConstructionNetworkNodeSize = sizeof(TE4GameConstructionNetworkNode);

константы идентичные, но переменная c_sTE4GameConstructionNetworkNodeSize в одном проекте указывает размер 160 байт, в другом 164. Идеи?


#1
19:45, 21 сен. 2014

Osiris
> Идеи?

1) Разные настройки выравнивания по умолчанию (в свойствах проекта)
2) size_t 4->8 байт если второй проект под 64 бита

#2
20:05, 21 сен. 2014

outcast
> 2) size_t 4->8 байт если второй проект под 64 бита

Не, оба 32. И это почему-то только с этим классом.

#3
20:18, 21 сен. 2014

Размер вектора разный ... походу выравнивание.

#4
20:29, 21 сен. 2014

Osiris
> Размер вектора разный ... походу выравнивание.

Не начинай классы с була :)

#5
20:36, 21 сен. 2014

outcast
> Не начинай классы с була :)

Я скорее сейчас уберу вектор и сделаю статическим)

#6
8:36, 22 сен. 2014

Та не, вектор ни при чём.
Он фиксированного размера!
Дело в выравнивании.
инфа 100%

#7
9:11, 22 сен. 2014

Osiris
Поставь какой-нибудь attribute(packed). А вообще лучше не париться)

#8
9:29, 22 сен. 2014

Не зря же мелкомягкие свой

typedef int BOOL
делали..

#9
10:34, 22 сен. 2014

Void12
> Та не, вектор ни при чём.
> Он фиксированного размера!

Вообще то я оставил один только вектор в классе и размер был разный. Потом восстановил все члены класса и заменил вектор на статический массив - проблема решена.
Так что имей привычку писать инфа 90% )

TheGrayWolf
> Не зря же мелкомягкие свой

Интересно, неужто bool бывает разного размера?

#10
10:48, 22 сен. 2014

Osiris
> Интересно, неужто bool бывает разного размера?
Я имел ввиду что делали как раз для выравнивания памяти, замени свои bool на BOOL и посмотри что будет.

#11
11:27, 22 сен. 2014

TheGrayWolf
> Не зря же мелкомягкие свой
Они сделали свой BOOL потому что когда они его делали, bool отсутвовал в стандарте.

Osiris
> Интересно, неужто bool бывает разного размера?
В принципе да. Так же как и wchar_t может быть и 16 бит и 32 бита. Так же как char не обязательно 8и битный.
(http://msdn.microsoft.com/en-us/library/tf4dy80a.aspx здесь указано что на старых компиляторах sizoef(bool) == 4 на новых sizeof(bool)==1 а вообще на одном и том же компиляторе, и одной и той же платформе
размеры типов будут идентичны.)

Что касается данного случая скорее всего действительно разница в настройках проекта, как выставлено выравнивание. Если тебе так принципиален размер, поставь #pragma pack до и после объявления класса

#12
11:46, 22 сен. 2014

TheGrayWolf
> Я имел ввиду что делали как раз для выравнивания памяти, замени свои bool на
> BOOL и посмотри что будет.

Вы меня как будто не читаете, я же написал - убрал std::vector из класса и размеры сравнялись.

Стас
> Если тебе так принципиален размер, поставь #pragma pack до и после объявления
> класса

Угу, запомню на будущее.

#13
11:53, 22 сен. 2014

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

#pragma pack(push,1)
struct alignment_1
{
  bool value;
  int  value2;
};
#pragma pack(pop)

#pragma pack(push,2)
struct alignment_2
{
  bool value;
  int  value2;
};
#pragma pack(pop)

#pragma pack(push,4)
struct alignment_4
{
  bool value;
  int  value2;
};
#pragma pack(pop)

#pragma pack(push,8)
struct alignment_8
{
  bool value;
  int  value2;
};
#pragma pack(pop)

  printf( "alignment 1: %i\n", sizeof(alignment_1));
  printf( "alignment 2: %i\n", sizeof(alignment_2));
  printf( "alignment 4: %i\n", sizeof(alignment_4));
  printf( "alignment 8: %i\n", sizeof(alignment_8));


На моей студии я получил такой результат:

alignment 1: 5
alignment 2: 6
alignment 4: 8
alignment 8: 8

#14
15:14, 22 сен. 2014

Osiris
> убрал std::vector из класса и размеры сравнялись

Ну правильно, std::vector это не примитивный тип (и не состоит из них), закладываться на то что известен его размер нельзя.

Страницы: 1 2 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.