我有一个类似这样的课程:
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关键字也不会改变它(我不明白它的用途,因为它发生了!)
这很烦人,我现在会使用内部类型,因为我不会经常触及数据,但是让我的课程像我想要的那样工作会很棒。
答案 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”中使用了更多的虚函数,这进一步增加了它的大小? 问题可能与您的编译器或体系结构有关。