1

我有一堂课是这样的:

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。

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

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

4

4 回答 4

2

C++ 编译器可以使该结构为 128 个字节。C++ 标准没有定义结构/联合的大小。但是,大多数编译器都有一个非标准的 __PACKED 属性,您可以将其添加到结构的声明中,它只会占用它需要的确切字节数

于 2009-11-17T15:05:10.053 回答
1

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

顺便说一句,“struct {”与“class { public:”相同

于 2009-11-17T15:06:36.020 回答
1

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

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

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

于 2009-11-17T15:07:09.547 回答
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”中使用了更多的虚函数,从而进一步增加了它的大小?该问题也可能与您的编译器或体系结构有关。

于 2009-11-17T15:18:33.803 回答