最近在AI插件中引入QT,想利用其界面功能做些AI中缺乏的表格等控件,来展示数据。当中用到了继承基类QTableWidget来实现自定义的新类,引入了四个新的成员变量,为string类型,编译过程很顺利,没有什么问题,在debug阶段程序跑起来后,运行到新定义的类的对象的方法的时候,程序直接挂掉。后来尝试将这几个成员注释掉,结果程序正常执行。但是我又特别需要几个私有数据成员,原本想从构造函数中初始化,就可以用了,但是被目前的问题憋了很久,几乎崩溃。后来找高人看了下,将原来的string类型数据成员注释掉,添加新的QT自己的数据类型,结果也都挂掉。
转机出现在尝试了一个int* 数据类型成员变量放在所有成员变量的最前面。结果居然就行了,呜呼怪哉!
后来牛人发现可能跟字节对齐有关,即属性配置里面的结构成员对齐设置:就是这么个东西,要了亲命了
结果将原来的2字节改成默认值 ,将那个新加的int* 类型数据成员注释掉也是可以的。
至此:问题得到解决,那么字节对齐又是什么个意思呢?查下MSDN里面的注释如下:
/Zp(结构成员对齐)
控制结构的成员如何封装到内存并为模块中的所有结构指定相同的封装。
当指定此选项时,第一个结构成员后的每个结构成员将存储在成员类型大小或 n 字节边界(其中 n 为 1、2、4、8 或 16)两者中较小的一个边界上。
下表描述了可用的值。
- 1
-
在 1 字节边界上封装结构。与 /Zp 相同。
- 2
-
在 2 字节边界上封装结构。
- 4
-
在 4 字节边界上封装结构。
- 8
-
在 8 字节边界上封装结构(默认操作)。
- 16
-
在 16 字节边界上封装结构。
除非有特定的对齐要求,否则不应使用此选项。
还可以使用 pack 控制结构封装。有关对齐方式的更多信息,请参见:
在 Visual Studio 开发环境中设置此编译器选项
-
打开此项目的“属性页”对话框。有关详细信息,请参见如何:打开项目属性页。
-
单击“C/C++”文件夹。
-
单击“代码生成”属性页。
-
修改“结构成员对齐”属性。