首页 文章

使用Matlab进行MEXing C时,size_t和mwSize之间的差异

提问于
浏览
8

我目前正在努力将一些C文件移植到64位Matlab,这些文件是用32位Matlab进行的 .

在这样做时,我遇到了两种类型,一种来自Matlab人,一种来自C标准 .

这是Matlab文档中关于mwSize的内容:

mwSize(C和Fortran)大小值的类型说明mwSize是一种表示大小值的类型,例如数组维度 . 使用此功能可实现跨平台灵活性 . 默认情况下,mwSize等效于C中的int . 使用mex -largeArrayDims开关时,mwSize等效于C中的size_t . 在Fortran中,mwSize类似于INTEGER * 4或INTEGER * 8,基于平台和编译标志 .

这就是维基百科对size_t的评价:

size_t是由stddef.h中定义的几个C / C标准(例如,C99 ISO / IEC 9899标准)定义的无符号数据类型 . [1]它可以通过包含stdlib.h进一步导入,因为这个文件内部子包含stddef.h [2] . 此类型用于表示对象的大小 . 采用或返回大小的库函数期望它们属于此类型或返回类型为size_t . 此外,最常用的基于编译器的运算符sizeof应该计算为与size_t兼容的值 . size_t的实际类型取决于平台;一个常见的错误是假设size_t与unsigned int相同,这可能导致编程错误,[3] [4]例如从32位移植到64位架构时 .

据我所知,这些类型实际上是相同的 . 我的问题是:1)是吗? 2)如果是,哪一个被认为是更好的编程品味使用 . 理想情况下,我们希望我们的代码与未来的Matlab版本兼容 . 我猜测答案是mwSize,但我不确定 .

编辑:我应该补充一点,Matlab人正在使用两者 . 例如,

size_t mxGetN(const mxArray *pm);

是一个检索mxArray列数的函数 . 但是,当一个人创建矩阵时,人们会使用,

mxArray *mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity ComplexFlag);

输入显然应该是mwSize .

1 回答

  • 10

    mwSize 是为了向后兼容性和可移植性而定义的 . 如文档所述,它在编译期间未使用 -largeArrayDims 开关时映射到 int ,而在编译时使用 size_t . 因此,在第一种情况下 mwSize 已签名,但在第二种情况下,则不是 .

    在代码中使用 mwSize 允许您在所有平台上重复使用代码,无论是否使用该标志 .

    至于您指出的API不一致性,它们确实是不一致的,但不是主要关注的问题 . mxGetN() 永远不会返回负数,所以让它返回 size_t 就可以了 . 但是,(我猜测)旧版本或某些平台上的mex API版本期望将int传递给 mxCreateDoubleMatrix() ,因此将函数定义为采用 mwSize 类型的输入使其可移植和/或向后兼容 .

    简而言之,使用 mwSize 并使用 -largeArrayDims 来编译mex函数 .

相关问题