【问题标题】:Difference between size_t and mwSize when compiling C MEX-files for Matlab为 Matlab 编译 C MEX 文件时 size_t 和 mwSize 之间的区别
【发布时间】:2011-09-28 22:21:39
【问题描述】:

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

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

这就是 Matlab 文档中关于 mwSize 的说法:

mwSize(C 和 Fortran)

尺寸值的类型

说明

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

这就是维基百科所说的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。

【问题讨论】:

  • 嗯...作为基本检查,只需确保它们具有相同的大小:assert(sizeof (size_t) == sizeof (mwSize)); 并使用其中任何一个。如果assert 失败,你就完蛋了。
  • @pmg:如果在编译 mex 函数时不使用-largeArrayDims 开关,则断言将在size_t 大于int 的平台上失败。这就是拥有mwSize typedef 的全部意义。
  • +1 感谢@Praetorian。正如我在评论中所说,assert 仅作为基本检查:我不知道墨西哥特定的东西。

标签: c matlab types 32bit-64bit mex


【解决方案1】:

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

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

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

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

【讨论】:

  • 关于样式的另一个问题:mwIndex 和 mwSize(在文档中)是相同的,除了一个用于索引,一个用于大小。这是什么原因?只是为了让代码更清晰吗?所以在for(i=0; i<=n; i++) 中,i 是 mwIndex,n 是 mwSize,但对我来说,这种划分似乎是不必要的。
  • @Har:我也从来不明白拥有 mwIndex 的原因。在某些情况下,它确实使代码更易于遵循,但正如您所指出的,当迭代 mxArray 的某个维度时,与 mwSize 相比,您最终会得到一个 mwIndex,我也不喜欢这样。我倾向于将 mwSize 用于所有内容。
猜你喜欢
  • 2020-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
  • 1970-01-01
  • 2013-12-18
相关资源
最近更新 更多