我目前正在为32位Matlab将一些C MEX文件移植到64位Matlab。
在这个过程中,我遇到了两种类型,一种来自Matlab人员,另一种是C标准。
这就是Matlab文档所说的:mwSize
(C和Fortran)
大小值的类型
描述mwSize
是表示大小值(如数组维度)的类型。使用此功能实现跨平台的灵活性。默认情况下,mwSize
等同于c中的mwSize
。使用int
开关时,mex -largeArrayDims
等同于c中的mwSize
。在fortran中,size_t
类似于基于平台和编译标志的mwSize
或INTEGER*4
。
维基百科就是这么说的:INTEGER*8
是由几个C/C++标准(例如C99 ISO/IEC 9899标准)定义的未签名的数据类型,定义在size_t
中。[ 1 ]它可以通过包含size_t
来进一步导入,因为该文件内部包含了stddef.h
(2)。
此类型用于表示对象的大小。接受或返回大小的库函数希望它们是这种类型或返回类型为stdlib.h
。此外,最常用的基于编译器的运算符stddef.h
的计算值应与size_t
兼容。sizeof
的实际类型依赖于平台;一个常见的错误是假设size_t
与size_t
相同,例如,当从32位体系结构移动到64位体系结构时,这可能导致编程错误[3][4]。
据我所见,这些类型实际上是相同的。我的问题是:
是吗?
如果它们是,哪一个会被认为是更好的编程品味使用?理想情况下,我们希望我们的代码与未来的Matlab版本兼容。我猜答案是size_t
,但我不确定。
编辑:我要补充的是,Matlab的人同时使用这两种工具。例如:
size_t mxGetN(const mxArray *pm);
是一个函数,用于检索MXArray的列数。然而,当我们创建一个矩阵时,我们使用,
mxArray *mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity ComplexFlag);
其中输入显然应该是mwsize。
最佳答案
mwSize
是为了向后兼容和可移植性而定义的。如文档所述,当编译期间未使用int
开关时,它将映射到-largeArrayDims
,当编译期间未使用size_t
开关时,它将映射到mwSize
。所以,在第一种情况下mwSize
是有符号的,但在第二种情况下,它不是。
在代码中使用mxGetN()
允许您在所有平台上重用代码,而不管是否使用了该标志。
至于您所指出的api不一致,它们确实是不一致的,但不是主要关注的问题。size_t
永远不会返回负数,因此让它返回amxCreateDoubleMatrix()
是可以的。不过,(我猜)在某些平台上,较旧版本或mex api版本希望向mwSize
传递一个int,因此将函数定义为接受mwSize
类型的输入使其可移植和/或向后兼容。
简而言之,使用-largeArrayDims
和来编译mex函数。