我目前正在为32位Matlab将一些C MEX文件移植到64位Matlab。
在这个过程中,我遇到了两种类型,一种来自Matlab人员,另一种是C标准。
这就是Matlab文档所说的:
mwSize(C和Fortran)
大小值的类型
描述
mwSize是表示大小值(如数组维度)的类型。使用此功能实现跨平台的灵活性。默认情况下,mwSize等同于c中的mwSize。使用int开关时,mex -largeArrayDims等同于c中的mwSize。在fortran中,size_t类似于基于平台和编译标志的mwSizeINTEGER*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_tsize_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函数。

07-26 08:16