2013-02-25 2 views
1

Привет У меня есть некоторые проблемы с размером класса/структуры Вот мой Graphnode.h, у меня только 4 vars в нем - один 16-unsigned char array, три unsigned char, я думаю размер должен быть 19. Почему это 32?C++ Класс/Структура размер

Graphnode currentNode; 
cout<< sizeof(currentNode)<<endl;// why this is 32 ? 
cout<< sizeof(currentNode.state)<< endl;// this is 16 

Graphnode.h:

#include <stdio.h> 
#include <stdlib.h> 
#include <tr1/array> 

//using namespace std; 
class Graphnode { 

public: 
    std::tr1::array<unsigned char, 16> state; 
    unsigned char x; 
    unsigned char depth; 
    unsigned char direction; 
    Graphnode(std::tr1::array<unsigned char, 16>,unsigned char,unsigned char, unsigned char); 
    Graphnode(); 

}; 
Graphnode::Graphnode() 
{ 
    int i=0; 
    for(i=0;i<16;i++) 
    { 
     state[i] = 0; 
    } 
    x = 0; 
    depth = 0; 
    direction = 0; 
} 

Graphnode::Graphnode(std::tr1::array<unsigned char, 16> _state,unsigned char _x,unsigned char _d,unsigned char _direction) 
{ 
    int i=0; 
    for(i=0;i<16;i++) 
    { 
     state[i] = _state[i]; 
    } 
     x = _x; 
     depth = _d; 
     direction = _direction; 
} 
+0

Просто для любопытства я попытался напечатать адрес разных членов вашей структуры, чтобы узнать, как/где пространство пропадает. У меня такое ощущение, что компилятор предполагает, что ваш объект должен быть выровнен с 16 байтами и добавлением дополнений в конец. Попробуйте выполнить печать: 'Graphnode g; std :: cout << (void *) & g.state << "," << (void *) & g.x << "," << (void *) & g.depth << "," << (void *) & g.direction << "\ n"; ', который должен печатать три указателя, а различия между ними скажут вам, где компилятор добавляет дополнение в этом случае. –

ответ

2

Поскольку компилятор не раскладывать элементы структуры данных один непосредственно после того, как другой; он также оставляет padding между ними.

Обычно это означает, что любая структура будет кратной некоторой сумме, зависящей от типов, которые она содержит, и целевой платформы, даже если сумма размеров полей меньше.

Все компиляторы обычно offer нестандартные extensions, которые позволяют вам контролировать эту упаковку в меньшей или большей степени.

+0

В любом случае, чтобы избежать заполнения? спасибо – weeo

+0

@weeo, это зависит от того, какой компилятор вы используете. –

+0

@weeo: Да, я просто немного расширился. – Jon

Смежные вопросы