为什么这些C/Cython数组被定义为字符,而不是整数数组?

flo*_*low 0 c python cython

为了解决问题#3367795在这里我必须应对一些子问题.其中之一是:在所述算法(levenshtein距离)中,在存储器中分配了几个数组并用线初始化

cdef char   *m1     = <char *>calloc(   blen + 2,    sizeof( char ) )
cdef char   *m2     = <char *>calloc(   blen + 2,    sizeof( char ) )
cdef char   *m3     = <char *>malloc( ( blen + 2 ) * sizeof( char ) )
#.........................................................................
for i from 0 <= i <= blen:
  m2[ i ] = i
  <...snip...>
Run Code Online (Sandbox Code Playgroud)

blen这里指的是Python bytes变量的长度.现在,据我所知的算法(参见我的原始帖子中的完整代码)和初始化代码m2清楚地显示,这些数组意味着保存整数,而不是字符,所以人们会认为正确的分配应该看起来喜欢

cdef int    *m3     = <int *>malloc( ( blen + 2 ) * sizeof( int ) )
Run Code Online (Sandbox Code Playgroud)

等等.任何有C背景的人都可以向我解释为什么char使用它?对于倾向于Cython的人来说,也许更多,为什么有演员<char *>?人们会认为char *x = malloc( ... )应该足以定义x.

AnT*_*AnT 8

尽管误导名称,char类型在C语言中是普通积分的类型,就像short,int,long和这样的.在所有积分类型中,chars具有最小范围并占据最小的存储量.因此,如果在您的应用程序中保存尽可能多的内存非常重要,那么使用它char代替可能是有意义的int.

在某些硬件平台上,可能会发现int类型比类型工作得更快char,因此特定类型的选择成为速度与内存之间的权衡,但是,在很多情况下,当范围char自然足够时,它使用char而不是更有意义int.

  • 至少*if*这是一个小的整数,永远不应该使用`char`作为类型,因为它的签名是未定义的,并且可能因平台而异.使用`signed char`,`unsigned char`或更好的提到的`int_fast8_t`或`int8_T`等. (4认同)