Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > про размер указателей


Автор: yaja 6.10.2005, 23:41
Имеется следующий класс(оставим его функциональную начинку и как написать это-же, но быстрее)


Код

class KDNode {
private:
  float split;
  unsigned int data; 
public:
  KDNode() : data(6), split(0) {}

  void setSplit(float spl) { split = spl; }
  float getSplit() const { return split; }

  void setLeaf(bool leaf) { data = (leaf) ? (data | 4) : (data & 0xfffffffb); }
  bool isLeaf() const { return ((data & 4) > 0); }

  void setAxis(unsigned int axis) { data = (data & 0xfffffffc) + axis; }
  unsigned int getAxis() const { return (data & 3); }

  void setLeft(KDNode* left) { data = (unsigned int)left + (data & 7); } // 1
  KDNode *getLeft() const { return (KDNode *)(data & 0xfffffff8); } // 2
  KDNode *getRight() const { return getLeft() + 1; }

  void setList(ListNode* list) { data = (unsigned int)(list) + (data & 7); } // 3
  ListNode *getList() const { return (ListNode *)(data & 0xfffffff8); }  // 4
  void AddObject(Object *obj);
};

У меня стоит студия 2003 и она мне пишет дурацкие ворнинги, тина размер KDNode* и unsigned int различны
в месте 2 и 4
Цитата
type cast' : conversion from 'const unsigned int' to 'ListNode *' of greater size

а в месте 1 и 3
Цитата
warning C4311: 'type cast' : pointer truncation from 'ListNode *' to 'unsigned int


Я и так и сяк пытался от них избавиться, но тщетно, может кто-то знает в чем тут беда (может в проперти прописать что нужно) и как от этого избавиться (кроме их отключения)
Буду благодарен любой помощи smile

Автор: chaos 7.10.2005, 06:11
во первых я бы
Код

unsigned int data; 

замени на
Код

unsigned long data; //DWORD data;


второе:
одно из решений
например
Код

ListNode *getList() const 
{ return (ListNode *)(data & 0xfffffff8); }

заменить на
Код

ListNode *getList() const 
{ return reinterpret_cast<ListNode *>(data & 0xfffffff8); }

Автор: chipset 7.10.2005, 06:12
Цитата
разве он отличен от sizeof(int)

ОХ! Размеры типов в С++ эта такая штука которая меняеться от компилятора к компилятору, поэтому рассчитывать на какой-то определенный размер указателя либо типа очень некрасиво и опасно.

Автор: yaja 7.10.2005, 19:06
Спустя 10 минут, после того, как создал тему, осенило, что наверное на 64-битной платформе sizeof(int) = 4
а указатель имеет размер 8 ))
Есче через 3 минуты нашел в свойствах проекта опцию о проверке совместимости с 64-битной платформой. Если там поставить No то ворнинги пропадают smile

chaos пробовал и то и другое не помагало, но все равно спасибо за помощь.

chipset Канечно некрасиво, но если все-таки использовать, то можно хорошо выровнять данные в кэш-линию и получить + 25-30% скорости, а так, как пишу я для души, а не для компании, то можно и написать такой код smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)