C++ C++;类别/结构尺寸

C++ C++;类别/结构尺寸,c++,class,struct,sizeof,C++,Class,Struct,Sizeof,嗨,我对类/结构的大小有一些问题 这是我的Graphnode.h,我只有4个变量-一个16无符号字符数组,三个无符号字符,我认为大小应该是19。为什么是32 Graphnode currentNode; cout<< sizeof(currentNode)<<endl;// why this is 32 ? cout<< sizeof(currentNode.state)<< endl;// this is 16 图形节点currentNode

嗨,我对类/结构的大小有一些问题 这是我的Graphnode.h,我只有4个变量-一个16无符号字符数组,三个无符号字符,我认为大小应该是19。为什么是32

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

cout,因为编译器没有将数据结构成员一个接一个地排列;它也会介于两者之间

通常这意味着任何结构都将是某个数量的倍数,这取决于它所包含的类型和目标平台,即使字段大小之和较小


所有的编译器通常都是非标准的,可以让您在较小或更大程度上控制此打包。

@weeo,这取决于您使用的编译器。@weeo:是的,我只是扩展了一点。为什么您认为避免填充会是一件好事?一般来说,添加填充是因为编译器认为在某种程度上需要填充,因此试图避免填充可能会破坏编译器“让事情变得更好”的意图。@Jon还有一个问题。现在C++类和C类结构没有区别。对吗?他们几乎一样?我想知道我的代码是否是一个好的C++表单?THanks@MatsPetersson我想当你把太多的数据弄乱的时候,最好知道什么是最好的不是编译器(:不过只是猜测;我也想听听其他的东西^^^出于好奇,我会尝试打印结构中不同成员的地址,以查看空间是如何/在何处浪费的。我感觉编译器假设您的对象需要与16字节对齐,并在末尾添加填充。试着打印:
Graphnode g;std::cout
#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;
}