为什么我的对象占用64个字节而不是32个?

时间:2009-11-17 15:01:52

标签: c++ struct unions

我有一个类似这样的课程:

class myType
{

  union {
      float data[4];
      other_vector4_type v
  } ;
  typedef union {
      float data[4];
      other_vector4_type v
  } myType-internal_t;

 <various member functions, operator overloads>

}

现在我想在顶点缓冲区中使用此类型,但sizeof()不是预期的。我将类对齐为16个字节。

sizeof(myType)产生64。

sizeof(myType::myType-internal_t)收益率为32。

我已经阅读了很多关于数据对齐的文章,但我不知道我在哪里使用额外的数据。我尝试剥离自定义构造函数但它保持不变,交换struct的class关键字也不会改变它(我不明白它的用途,因为它发生了!)

这很烦人,我现在会使用内部类型,因为我不会经常触及数据,但是让我的课程像我想要的那样工作会很棒。

4 个答案:

答案 0 :(得分:2)

C ++编译器可以为它所关心的所有结构提供128字节。结构/联合的大小不是由C ++标准定义的。但是,大多数编译器都有一个非标准的__PACKED属性,你可以添加到struct的声明中,它只占用它需要的确切字节数

答案 1 :(得分:1)

如果您的类中有虚函数,由于vtable指针,它会使您的对象大于内部类型。

BTW“struct {”与说“class {public:”

相同

答案 2 :(得分:1)

我想你会为你的对象定义一个vtable指针。要么是因为启用了RTTI,要么是任何虚拟方法(包括析构函数)都会添加vtable

http://en.wikipedia.org/wiki/Virtual_method_table

  

通常,编译器为每个类创建一个单独的vtable。创建对象时,会将指向此vtable的指针(称为虚拟表指针或vpointer)添加为此对象的隐藏成员(成为其第一个成员,除非它成为最后一个[2])。编译器还在每个类的构造函数中生成“隐藏”代码,以将其对象的vpointers初始化为相应vtable的地址。

答案 3 :(得分:1)

我刚刚编译了

#include <xmmintrin.h>
#include <iostream>

struct myType
{
    union {
        float data[4];
        __v4sf v;
    };
    typedef union {
        float data[4];
        __v4sf v;
    } myType_internal_t;
};

int main() {
    std::cout << sizeof(myType) << std::endl;
    std::cout << sizeof(myType::myType_internal_t) << std::endl;
}

结果是:

16
16

在64位拱门上使用gcc。正如所料。 “__v4sf”是由四个浮点数组成的矢量类型。所以问题可能在你的“other_vector_4_type”中。也许它是多态的和虚拟的,包含两个vtable?你在“myType”中使用了更多的虚函数,这进一步增加了它的大小? 问题可能与您的编译器或体系结构有关。