10

我目前正在将一些用于 32 位 Matlab 的 C MEX 文件移植到 64 位 Matlab。

在此过程中,我遇到了两种类型,一种来自 Matlab 人,一种是 C 标准。

这就是 Matlab 文档所说的mwSize

mwSize(C 和 Fortran)

输入尺寸值

描述

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

这就是维基百科所说的size_t

size_t是由多个 C/C++ 标准(例如,C99 ISO/IEC 9899 标准)定义的无符号数据类型,在stddef.h.[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。

4

1 回答 1

12

mwSize为向后兼容性和可移植性而定义。正如文档所述,它映射到编译期间何时不使用开关,int何时使用。所以,在第一种情况下是签名的,但在第二种情况下,它不是。-largeArrayDimssize_tmwSize

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

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

简短的回答是,使用mwSize和使用-largeArrayDims来编译 mex 函数。

于 2011-07-05T17:00:13.363 回答