GLboolean has_alpha;
GLuint width;
GLuint height;
GLuint length;
GLuint millisPerFrame;
GLfloat uv[2];
GLuint texsize[2];
GLint compsize;
// location2
long preload_interval_next;
long preload_interval;
如果我把has_alpha放在(location2)我得到
a)不同的对象大小,sizeof报告248而不是252字节
和
b)沉重的堆损坏
GLboolean定义为unsigned char,但因为我根本没有使用NO优化 (仔细检查了这个)这应该填充到4个字节。 最后,如果它填充,它应该在两个位置都这样做。
编译器测试:CLANG(c ++),GCC4.2 com.apple.compilers.llvmgcc42
任何人都知道如何追踪这个?
答案 0 :(得分:2)
我非常怀疑问题出在您发布的代码中。你需要向我们展示课程的其余部分。但有些提示:
a)可能由于对齐而发生(不,它不应该在两个地方都这样做,请阅读data alignment)
b)如果将此结构的指针传递给某些期望某种有序对齐的GL调用,则可能会发生
答案 1 :(得分:2)
此处的问题几乎肯定不在您列出的成员中,而是另一个,可能是int
,指针或bool
未在构造函数中正确初始化。请发布一个更大的失败示例,并确保使用构造函数初始化列表初始化所有成员。
答案 2 :(得分:1)
如果你想找出填充的位置,你可以使用gcc的-Wpadding选项,或试用pahole,它可以用来优化结构大小:https://twiki.cern.ch/twiki/bin/view/Atlas/UsingPahole
答案 3 :(得分:1)
如果它在开始时它必须填充以使其他变量在右对齐上。如果它在最后它没有垫,它可能会消失到已经填充的大小。那里没有神秘感。
堆腐败与此无关,它只是由于新的大小而具有不同的分配而暴露 - 即随机机会。