Разница между size_t и mwSize при компиляции C MEX-файлов для Matlab - PullRequest
10 голосов
/ 05 июля 2011

В настоящее время я работаю над переносом некоторых C MEX-файлов для 32-битного Matlab на 64-битный Matlab.

При этом я сталкивался с двумя типами: один из людей Matlab, а другой - стандарт C.

Это то, что говорится в документации Matlab mwSize:

mwSize (C и Fortran)

Тип для значений размера

Описание

mwSize - это тип, который представляет значения размера, такие как размеры массива. Используйте эту функцию для кроссплатформенной гибкости. По умолчанию mwSize эквивалентно int в C. При использовании переключателя mex -largeArrayDims, mwSize эквивалентно size_t в C. В Fortran mwSize аналогично эквивалентно INTEGER*4 или 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.

1 Ответ

12 голосов
/ 05 июля 2011

mwSize определено для обратной совместимости и переносимости. Как указано в документации, он отображается на int, когда переключатель -largeArrayDims не используется во время компиляции, и size_t, когда он используется. Итак, в первом случае mwSize подписано, а во втором - нет.

Использование mwSize в вашем коде позволяет вам повторно использовать код на всех платформах, независимо от того, используется этот флаг или нет.

Что касается указанных вами несоответствий API, то это действительно несоответствия, но не те, которые вызывают серьезную озабоченность. mxGetN() никогда не вернет отрицательное число, поэтому возвращение size_t в порядке. Однако (я предполагаю) более старые версии или версии mex API на некоторых платформах ожидают, что значение int будет передано mxCreateDoubleMatrix(), поэтому определение функции как ввода типа mwSize делает его переносимым и / или обратно совместимым.

Краткий ответ: используйте mwSize и -largeArrayDims для компиляции функции mex.

...