我有一个类FlyCommand
看起来像这样:
class FlyCommand : public Command
{
public:
FlyCommand(float x, float y, float z) : dir(x, y, z, 0.0f) {}
virtual void execute(SomeOtherClass& someOtherClassRef)
{
std::cout << dir.x << dir.y << dir.z << std::endl; //pretend there's spaces in between
}
virtual ~FlyCommand(){}
private:
glm::vec4 dir;
};
它继承自Command
,它只是一个提供execute(SomeOtherClass&)
的界面。类型glm::vec4
是一个结构,表示具有4个浮点分量(x,y,z,w)的数学向量,它应该在16字节边界上对齐。
当我执行以下操作时:
int main()
{
SomeOtherClass* s = new SomeOtherClass();
FlyCommand* c = new FlyCommand(1.0f, 2.0f, 3.0f);
c->execute(*s);
delete s;
delete c;
}
而不是打印1.0 2.0 3.0
,它会显示出似乎是垃圾的东西,如果是常量垃圾,就像0 -4.22017e+037 3.135e-017
一样。但是,我的调试器(MSVC 2013)显示dir.x(1.0),dir.y(2.0)和dir.z(3.0)的正确值。
我99%确定打印出来的垃圾问题是对齐问题,因为GLM库提供了一个#define GLM_FORCE_PURE
的东西,可以使值打印出来,但是不允许使用关于向量的SSE东西。
但我只是想知道为什么调试器显示的值与打印的值不同。不应该是调试器,呃,我不知道,“读取”结构成员的方式与编译器相同吗?对于一个与对齐无关的东西和另一个对齐依赖的东西没有任何意义,它(我几乎不知道这意味着什么)?