1

こんにちは、クラス/構造体のサイズについて問題があります。これが私の Graphnode.h です。1 つの 16 符号なし文字配列と 3 つの符号なし文字配列しかありません。サイズは 19 にすべきだと思います。 32?

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;
}
4

1 に答える 1

2

コンパイラはデータ構造メンバーを次々にレイアウトしないためです。また、間にパディングを残します。

通常、これは、フィールドのサイズの合計がそれよりも小さい場合でも、含まれる型とターゲット プラットフォームに応じて、構造体が何らかの量の倍数になることを意味します。

通常、すべてのコンパイラは、このパッキングを多かれ少なかれ制御できる非標準の拡張機能を提供します。

于 2013-02-25T23:02:26.003 に答える