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

时间:2010-07-31 21:07:51

标签: python c 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...>

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

cdef int    *m3     = <int *>malloc( ( blen + 2 ) * sizeof( int ) )

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

2 个答案:

答案 0 :(得分:8)

尽管名称误导,但C语言中的char类型是普通的整数类型,就像shortintlong等。在所有整数类型中,char具有最小范围并占据最小的内存量。因此,如果在您的应用程序中保存尽可能多的内存非常重要,那么使用char代替int可能是有意义的。

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

答案 1 :(得分:2)

非常简单,为了节省内存 - 但请注意,将这些数组声明为char会将结果距离限制为127或255,具体取决于C编译器默认为signed char或{分别为{1}}。在C中,unsigned char是整数类型 - 您不需要char来获取其整数值。

您的原始代码未提及此限制。 请注意,如果ord()溢出,则会默默地执行,代码会产生错误的结果 - 127 + 1 - &gt; -128(签名); 255 + 1 - &gt; 0(无符号)。

你没有回复我对你原来问题的评论:“”“(a)你的琴弦的最大(b)平均大小是多少?你真的需要做整个O(M * N)的事吗?如果这两个字符串彼此不一样吗?“”“.....请现在回答(编辑你的问题);如果你这样做了,那么你会回答这个问题。

更新:再次阅读原帖,我发现了一个问题:代码为

char

错误有三个原因:(1)它没有正确地对行进行洗牌(在交换m1, m2 = m2, m1 strcpy( m3, m2 ) strcpy()之前应该m1)(2)m2不会复制超出第一个空(零字节)的任何东西(3)没有必要复制任何东西,只需改变指针

strcpy()